文章目录:
2.1 异常与错误
简述Error与Exception的区别。
Error表示的是JVM层面或系统级的严重错误,通常不是程序本身逻辑导致的,比如OutOfMemoryError、StackOverflowError等。这类问题一旦发生,说明运行环境已经不正常了,通常不可恢复,一般不在代码中去捕获和处理。Exception表示的是程序运行过程中可以预期、可以处理的问题,比如IOException、SQLException、NullPointerException等。对于 Exception,一般推荐在合适的层次进行捕获、处理或转换,让程序在出错时仍能做出合理的响应。
2.2 检查型异常与非检查型异常
简述Java中的检查型异常与非检查型异常的区别,并通过程序案例触发检查型异常和非检查型异常。
1、简述两种异常的区别
检查型异常: 在编译期就会被编译器检查。如果某个方法可能抛出检查型异常,编译器会强制要求要么在方法签名中
throws声明,要么在方法内部使用try-catch捕获并处理。都是继承自
Exception,但不包括RuntimeException及其子类,例如:IOException,SQLException,FileNotFoundException等。非检查型异常: 在编译期不会强制检查,可以不写
throws,也可以不写try-catch,编译照样通过。都是
RuntimeException及其子类,如:NullPointerException,ArrayIndexOutOfBoundsException,ArithmeticException等。通常表示代码错误或逻辑缺陷。
2、 编写一个程序读取磁盘上的文件,并处理 FileNotFoundException 检查型异常。import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TestFileNotFound {
public static void main(String[] args) {
File file = new File("test.txt");
FileReader reader = null;
try{
reader = new FileReader(file);
System.out.println("读取文件成功");
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
System.out.println("\n读取完成。");
} catch (FileNotFoundException e) {
System.out.println("文件未找到");
System.out.println("异常:" + e.getMessage());
} catch (IOException e) {
System.out.println("IO异常:" + e.getMessage());
}
}
}运行截图:
3、 编写一个进行数组操作的程序,故意触发 ArrayIndexOutOfBoundsException 非检查型异常。public class TestException {
public static void main(String[] args) {
int[] arr = {10, 20, 30};
System.out.println("数组长度:" + arr.length);
System.out.println("访问下标为0的元素:" + arr[0]);
System.out.println("访问下标为3的元素:" + arr[3]);
System.out.println("程序结束");
}
}运行截图:
2.3 运行时异常和非运行时异常
简述运行时异常和非运行时异常的区别。
运行时异常就是非检查型异常,非运行时异常就是检查型异常。和上面那个题一样。
2.4 异常的抛出
简述Java异常处理中throw和throws关键字的区别。
throw用在方法体内部,后面跟的是一个具体的异常对象,表示在这里立刻抛出这个异常。一旦执行到throw new XxxException(...),当前语句后面的代码不会再执行,程序会沿着调用栈把这个异常抛给上层去处理。因此,throw是一个实际抛出异常的动作,作用于对象;可以出现在方法里的任何位置,也可以根据逻辑条件决定是否抛出。throws则写在方法声明上,后面跟的是异常类型列表,表示这个方法有可能抛出这些异常,但不在这里处理,交给调用者处理。它本质上是对编译器和调用者的一个声明,尤其是对运行时异常,如果不写在throws里、也不在方法内部 try…catch,就无法通过编译。
2.5 自定义异常
见文件夹/code/5。
2.6 异常的处理(一)
见文件夹/code/6。
2.7 异常的处理(二)
见文件夹/code/7。
2.8 改错
import java.io.IOException;
public class Main {
public static void start() throws IOException, RuntimeException {
throw new RuntimeException("Unable to Start");
}
public static void main(String[] args) {
try {
start();
} catch (RuntimeException re) {
re.printStackTrace();
} catch (IOException ie) {
ie.printStackTrace();
}
}
}
代码下载: lab06-code.zip

