异常机制和File类
1. 异常机制(重点)
1.1基本概念
-
java.lang.Throwable类是Java语言中错误(Error)和异常(Exception)的超类。
-
其中Error类主要用于描述Java虚拟机无法解决的严重错误,通常无法编码解决,如:JVM挂掉了等。
-
其中Exception类主要用于描述因编程错误或偶然外在因素导致的轻微错误,通常可以编码解决,如:0作为除数等
1.2异常分类
- RuntimeException - 运行时异常,也叫作非检测性异常。
System.out.println(5 / 0); // 编译ok,运行阶段会发生算术异常
主要子类:
ArithmeticException类 - 算术异常
ArrayIndexOutOfBoundsException类 - 数组下标越界异常
NullPointerException - 空指针异常
ClassCastException - 类型转换异常
NumberFormatException - 数字格式异常
-
IOException和其它异常 - 其它异常,也叫作检测性异常:指在编译阶段都能被编译器检测出来的异常
Thread.sleep(1000);编译ok,不处理无法运行
- 注意:当程序执行过程中发生异常但又没有手动处理时,则由Java虚拟机采用默认方式处理异常,而默认处理方式就是:打印异常的名称、异常发生的原因、异常发生的位置以及终止程序。
1.3 异常的避免
- 以后的开发尽量使用if条件来避免异常的发生(避免不了就捕获;捕获不了就抛出)
- 过多的if判断会导致代码臃肿,可读性差
1.4异常的捕获(try-catch)
try {
编写可能发生异常的代码;
//碰到异常直奔catch分支处理
}
catch(异常类型 引用变量名) {
编写针对该类异常的处理代码;
}
...
finally {
编写无论是否发生异常都要执行的代码;
//通常用于进行善后处理,如:关闭已经打开的文件等。
}
注意:
-
采用多态写法:懒人的写法:
catch(Exception e) {} -
当需要编写多个catch分支时,切记小类型应该放在大类型的前面
-
无论发不发生异常,final类都回执行(等执行完final,再终止程序)
final考点: public static int test() { try { int[] arr = new int[5]; System.out.println(arr[5]); return 0; } catch (ArrayIndexOutOfBoundsException e) { e.printStackTrace(); return 1; } finally { return 2; // 提交结束方法并返回数据 } }
1.5 异常的抛出
1. 基本概念:
- 在某些特殊情况下有些异常不能处理或者不便于处理时,就可以将该异常转移给该方法的调用者,这种方法就叫异常的抛出。当方法执行时出现异常,则底层生成一个异常类对象抛出,此时异常代码后续的代码就不再执行
public void show() throws IOException{}
2.方法重写的三原则:
-
要求方法名相同、参数列表相同以及返回值类型相同
- 要求方法的访问权限不能变小,可以相同或者变大
- 要求方法不能抛出更大的异常;
- 子类重写的方法不能抛出更大、平级不一样的异常,但可以抛出一样的异常、更小的异常以及不抛出异常。
经验:
-
若父类中被重写的方法没有抛出异常时,则子类中重写的方法只能进行异常的捕获处理。
-
若一个方法内部又以递进方式分别调用了好几个其它方法,则建议这些方法内可以使用抛出的方法处理到最后一层进行捕获方式处理(try-catch)。
public static void test3() throws IOException {
test2();
}
public static void test2() throws IOException {
test1();
}
public static void test1() throws IOException {
show();
}
...
try {
test3();
} catch (IOException e) {
e.printStackTrace();
}
2. 自定义异常
基本概念
- 当需要在程序中表达年龄不合理的情况时,而Java官方又没有提供这种针对性的异常,此时就需要程序员自定义异常加以描述。
实现流程
-
自定义xxxException异常类继承Exception类或者其子类。提供两个版本的构造方法,一个是无参构造方法,另外一个是字符串作为参数的构造方法
public class AgeException extends Exception {
public AgeException() {
}
public AgeException(String message) {
super(message);
}
}
```java
public Person(String name, int age) throws AgeException {
this.name = name;
setAge(age);
}
public void setAge(int age) throws AgeException {
if (age > 0 && age < 150) {
this.age = age;
} else {
throw new AgeException("年龄不合理");
//如果在此处理异常(try-catch),对象还是会创建成功
}
...
Person p1= null;
try {
p1 = new Person("zhangfei",-1);
} catch (AgeException e) {
e.printStackTrace();
}
2.File类(重点)
2.1基本概念
- java.io.File类主要用于描述文件或目录路径的抽象表示信息,可以获取文件或目录的特征信息,如:大小等
常用方法
File(String pathname) | 根据参数指定的路径名来构造对象 |
boolean exists() | 文件或目录是否存在 |
String getName() | 用于获取文件的名称 |
long lastModified() | 用于获取文件的最后一次修改时间 |
String getAbsolutePath() | 用于获取绝对路径信息 |
boolean delete() | 用于删除文件,当删除目录时要求是空目录 |
boolean createNewFile() | 用于创建新的空文件 |
//.构造File类型的对象与c:/test/s.txt文件关联
File file=new File("c:/test/s.txt");
if (file.exists()){
System.out.println("名称:"+file.getName());
System.out.println("大小:"+file.length());
Date dateTime=new Date(file.lastModified());
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd,HH-mm-ss");
System.out.println("最后一次修改时间:"+simpleDateFormat.format(dateTime));
System.out.println("获取绝对路径:"+file.getAbsolutePath());
// System.out.println(file.delete()?"文件已删除":"文件删除失败");
}
else {
System.out.println(file.createNewFile()?"创建成功":"创建失败");
}
boolean mkdir() | 用于创建目录 |
---|---|
boolean mkdirs() | 用于创建多级目录 |
File[] listFiles() | 获取该目录下的所有内容 |
boolean isFile() | 判断是否为文件 |
boolean isDirectory() | 判断是否为目录 |
File[] listFiles(FileFilter filter) | 获取目录下满足筛选器的所有内容 |
String[] list[] | 获取指定路径下的文件与文件夹的名字存到String数组中 |
// 实现目录中所有内容获取的同时进行过滤
// 1匿名内部类的语法格式:接口/父类类型 引用变量名 = new 接口/父类类型() { 方法的重写 };
/*FileFilter fileFilter = new FileFilter() {
@Override
public boolean accept(File pathname) {
// 若文件名是以.avi为结尾,则返回true表示保留 否则返回false就是表示丢弃
return pathname.getName().endsWith(".avi");
}
};*/
// 2Lambda表达式的格式:(参数列表) -> {方法体}
FileFilter fileFilter = (File pathname) -> {return pathname.getName().endsWith(".avi");};
File[] filesArray2 = f3.listFiles(fileFilter);
for (File tf : filesArray2) {
System.out.println(tf);
}
// 自定义成员方法实现指定目录以及子目录中所有内容的打印
public static void show(File file) {
// 获取目录f3下的所有内容并记录到一维数组中
File[] filesArray = file.listFiles();
// 遍历数组
for (File tf: filesArray) {
String name = tf.getName();
// 判断是否为文件,若是则直接打印文件名称
if (tf.isFile()) {
System.out.println(name);
}
// 若是目录,则使用[]将目录名称括起来
if (tf.isDirectory()) {
System.out.println("[" + name + "]");
show(tf);
}
}
}
{
System.out.println(name);
}
// 若是目录,则使用[]将目录名称括起来
if (tf.isDirectory()) {
System.out.println("[" + name + “]”);
show(tf);
}
}
}