当前位置: 代码迷 >> 综合 >> 黑马程序员——基础学习(十二)异常(Throwable)类、文件(File)类及递归
  详细解决方案

黑马程序员——基础学习(十二)异常(Throwable)类、文件(File)类及递归

热度:92   发布时间:2023-12-14 00:14:06.0
------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

异常类(Throwable)

异常:程序在运行的过程中出现了不正常的情况。

异常的分类:

Throwable:

Error:严重的问题,比如内存异常。一般不需要处理。

Exception

RuntimeException:运行时期异常,一定是我们的代码出问题了。

RuntimeException:编译时期异常,必须要处理的,否则编译不能通过,报错。

JVM对于异常的默认处理方案

A:把异常的名称,原因以及错误的位置信息等输出在控制台

B:程序从这里停止。

编写处理方案:

try...catch...finally

try...catch...

try...catch...catch...

try...catch...finally...

try...catch...catch...finally...

try...finally...

a:如果是一个异常,可以try...catch.../try...catch...finally...

b:如果是多个异常,可以try...catch...catch.../try...catch...catch...finally...

c:JDk7的新特性:多个异常必须是平级关系

try...catch(Exception1 | Exception2 | Exception3 ... e) {...}

编译时期异常和运行时期异常的区别

A:编译时期异常是必须要进行处理的,否则编译不能通过。

B:运行时期异常可以处理,也可以不处理。

如果不处理,那么,程序还是不能继续执行。

throwthrows的区别

A:throw 用在方法体中,后面跟的是异常对象

如何后面跟的对象属于RuntimeException,那么,在方法上,可以没有throws

如果后面跟的对象属于非RuntimeException,那么,在方法上,必须有throws

B:throws 用在方法声明上,后面跟的是异常类名

我们是如何选择异常处理的呢?

一般来说,异常处理,都是针对编译时期异常做的。

建议:能自己处理的,就自己处理,如果实在处理不了的就抛出。

自定义异常:

A:如果我们出现的问题,是API没有提供对应的异常,那么我们需要自定义异常。

B:怎么着让类才算是一个异常类呢?

a:继承自Exception

b:继承自RuntimeException

C:如何实现异常类的代码呢?

a:如果不想给出任何信息,什么都不用写。

b:如果要给出信息,那么,建议写一个无参构造和一个带参数构造

super(message);

异常细节

A:父类的方法有异常,子类重写父类的方法的异常不能比父类异常更大。

B:父类的方法有多个异常,子类重写父类的方法异常也不能比父类的多或者大。

C:父类的方法如果没有异常,子类重写父类的方法是不能抛出异常的,有异常,也只能try进行处理。

自我体会:

以后看到调用方法的时候,有问题出现,点击鼠标,看到throws或者try...catch任选一种即可。

我的代码

public class Test {public static void main(String[] args) {Teacher t = new Teacher();try {t.checkScore(-20);} catch (MyException e) {e.printStackTrace();}}
}
public class Teacher {public void checkScore(int score) throws MyException {if (score < 0 || score > 100) {throw new MyException("分数越界");} else {System.out.println("分数正常");}}
}
public class MyException extends Exception {public MyException() {}public MyException(String message) {super(message);}
}

文件类(File)

因为IO流操作大部分都是针对文件或者目录的操作,所以,为了方便表示文件或者目录,java就提供了File类供我们使用。

构造方法:

A:File file = new File("D:\\a.txt");

B:File file = new File("D:\\","a.txt");

C:File file = new File("D:\\");

    File file2 = new File(file,"a.txt");

成员方法

A:创建功能

public  boolean  creatNewFile() throws IOException

B:删除功能

public boolean delete()

C:重命名功能

public boolean renameTo(File dest)需要传递的是一个重命名后的路径名称

D:判断功能

  public boolean isDirectory():判断该File对象是否是目录

  public boolean isFile():判断该File对象是否是文件

    public boolean exists():判断该File对象是否存在

   public boolean canRead():判断该File对象是否可读

    public boolean canWrite():判断该File对象是否可写

    public boolean isHidden():判断该File对象是否隐藏

E:基本获取功能

public String getAbsolutePath():获取绝对路径

  public String getPath():获取相对路径

    public String getName():获取名称

    public long length():获取大小,以字节为单位

  public long lastModified():获取最后一次修改时间的毫秒值

F:高级获取功能

  public String[] list():返回指定目录下的所有文件或者目录的名称(String)数组。

    public File[] listFiles():返回指定目录下的所有文件或者目录的File对象数组。

G:带过滤器的获取功能

  public String[] list(FilenameFilter filter)

    public File[] listFiles(FilenameFilter filter)

案例:

获取指定目录下的指定后缀名的文件名称。

以d盘目录下的jpg文件为例

我的代码:

import java.io.File;
import java.io.FilenameFilter;
public class FilenameFilterDemo {public static void main(String[] args) {// 封装目录。File srcFolder = new File("D:");// 获取该目录下所有文件和目录的File数组。String[] strArray = srcFolder.list(new FilenameFilter() {public boolean accept(File dir, String name) {return new File(dir, name).isFile() && name.endsWith("jpg");}}// 遍历for (String str : strArray) {System.out.println(str);}}
}

递归

方法定义中调用方法本身的现象

注意事项:

A:递归一定要有出口,否则就是死递归

B:递归次数不能过多,否则内存溢出

C:构造方法不能递归调用

我的代码:

public static void main(String[] args) {// show();show();}public static void show() {show();}
}

案例:

A:递归求阶乘

public class DiGuiDemo {public static void main(String[] args) {System.out.println(jc(5));}public static int jc(int n) {if (n == 1) {return 1;} else {return n * jc(n - 1);}}
}

B:递归删除带内容的目录

import java.io.File;
public class DeleteFolderDemo {public static void main(String[] args) {// 封装目录File srcFolder = new File("test");deleteFolder(srcFolder);}private static void deleteFolder(File srcFolder) {// 获取该目录下所有文件或者目录的File数组File[] fileArray = srcFolder.listFiles(); // [],nullif (fileArray != null) {// 遍历该File数组,得到每一个File对象for (File file : fileArray) {// 判断该File是文件还是目录if (file.isDirectory()) {deleteFolder(file);} else {// 就直接删除。System.out.println(file.getName() + "---" + file.delete());}}System.out.println(srcFolder.getName() + "---" + srcFolder.delete());}}
}

 我的感悟

递归的思想基本就是逆向的函数思维,以后开发一定有大用!

  相关解决方案