深入理解try…catch语句:
1、catch后面括号中的类型可以是具体的异常类型,也可以是该异常类型的父类型。
2、catch语句可以写多个。建议写catch的时候一个异常一个catch处理,这样有利于程序的调试。
3、catch写多个时,如果多个异常存在继承关系,顺序必须从子到父依次写。如果没有继承关系,catch的顺序没有要求。
测试代码:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test07 {
public static void main(String[] args) {
try {
new FileInputStream("H:\\test061.txt");
} catch (FileNotFoundException fnfe) { // 写同类型的,肯定没问题
System.out.println("文件未找到异常!");
fnfe.printStackTrace();
}
try {
new FileInputStream("H:\\test061.txt");
} catch (IOException ioe) { // 相当于多态:IOException ioe = new FileNotFoundException("文件未找到");
System.out.println("文件未找到异常!");
ioe.printStackTrace();
}
try {
new FileInputStream("H:\\test061.txt");
} catch (Exception e) { // 多态:Exception e = new FileNotFoundException("文件未找到");
System.out.println("文件未找到异常!");
e.printStackTrace();
}
// 如果try里面代码可能出现多种异常的一种,只能出现一种,因为出现异常,后面代码不会执行,而是进入catch语句
try {
FileInputStream fis = new FileInputStream("H:\\test061.txt"); // 抛出FileNotFoundException异常
fis.read(); // 抛出IOException异常
} catch (Exception e) { // 如果这样写,try里面的任意一个异常被捕捉后,都进入这个catch语句进行处理,显然不合适,应该多种异常换不同的捕捉方式
System.out.println("可能发生文件未找到异常!,也可能发生文件读写异常!"); // 这样处理太含糊,具体难于定位
e.printStackTrace();
}
try {
FileInputStream fis = new FileInputStream("H:\\test061.txt"); // 抛出FileNotFoundException异常
fis.read(); // 抛出IOException异常
} catch (FileNotFoundException fnfe) { // 捕捉FileNotFoundException异常
System.out.println("文件未找到异常!");
fnfe.printStackTrace();
} catch (IOException ioe) { // 捕捉IOException异常
System.out.println("文件读写异常!");
}
// 如果写多个catch语句,catch语句的顺序不能随意,必须按从子到父的顺序写
// 如果捕捉的异常对象没有继承关系,那没有顺序要求
/*try {
} catch (IOException ioe) {
System.out.println("文件读写异常!");
} catch (FileNotFoundException fnfe) { // 保错:FileNotFoundException 已经被捕捉
System.out.println("文件未找到异常!");
}*/
try {
FileInputStream fs = new FileInputStream("H:\\test061.txt");
int a = 10 / 0;
} catch (FileNotFoundException fnfe) { // FileNotFoundException异常属于编译时异常
System.out.println("文件未找到异常!");
} catch (ArithmeticException ae) { // ArithmeticException异常属于运行时异常
System.out.println("算术异常!");
}
// 无继承关系的两种异常,捕捉时catch语句顺序可以任意
try {
FileInputStream fs = new FileInputStream("H:\\test061.txt");
int a = 10 / 0;
} catch (ArithmeticException ae) {
System.out.println("算术异常!");
} catch (FileNotFoundException fnfe) {
System.out.println("文件未找到异常!");
}
// jdk8新特性允许catch语句中这样写:
try {
FileInputStream fs = new FileInputStream("H:\\test061.txt");
int a = 10 / 0;
} catch (FileNotFoundException | NullPointerException | ArithmeticException e) {
// 这样写允许多种不同型的异常,进入该分支catch语句中,我这里三种异常是随便写的,这就要求我们掌握异常的分类关系
System.out.println("可能是文件不存在异常,可能是空指针异常,可能是算术异常!");
}
System.out.println("异常捕捉后面代码能执行,来个hello world!意思一下");
}
}