一、异常的概念
异常指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。Java中异常的继承体系如下:
Object
Throwable
Exception
编译时异常
RuntimeException
Error
Exception
- 编译时异常:
- 所有Exception的直接子类以及子孙类都是“编译时异常”
- 该异常是可预期,很有可能发生的,发生的机率比较高
- 所有的编译时异常,要求程序员在编写程序阶段,必须对它进行处理,如果不处理的话,编译无法通过。处理异常有两种方式:捕捉和声明抛出。捕捉:try…catch…,声明抛出就是在方法声明的位置上使用throws关键字抛出异常
- 运行时异常:
- 所有RuntimeException的子类都是运行时异常
- 该类异常不一定发生,发生的机率比较低,如果代码没有出现逻辑错误,是不会发生
- 编译器不要求去处理,程序员在写代码时可以不处理
Error
- java程序运行过程中如果出现了错误,属于JVM和系统发生的错误,程序员无法解决的问题。例如:StackOverFlowError (一旦线程栈的大小增长超过了允许的内存限制,就会抛出 java.lang.StackOverflowError 错误)
非受检异常(unchecked):将派生于Error或RuntimeException类的所有异常称为非首检异常,其他所有的异常称为受检异常(checked)异常
二、异常的处理方式
- 使用throws 抛出异常
- 使用try…catch处理异常
1.使用throws 抛出异常
1.1 首先看一下要求异常处理的代码
public class Test02 {
public static void main(String[] args) {
m1();
}
public static void m1() {
m2();
}
private static void m2() {
m3();
}
private static void m3() {
new FileInputStream("D:/x.txt");
}
}
- 以上程序会发现FileInputStream在编译的时候会报红色波浪线
- 看源码发现FileInputStream这个构造方法在声明的位置上使用了throws FileNotFoundException(向上抛)
- FileNotFoundException继承Exception类,所以属于编译时异常,要求程序员必须对其进行异常处理(throws抛出或者try…caych)
1.2 对上述代码使用throws抛出异常
在方法声明的位置上使用throws FileNotFoundException就可以编译通过了,或者写IOException,或者写Exception,写比FileNotFoundException更宽泛的异常就可以。
public class Test02 {
public static void main(String[] args) throws FileNotFoundException {
m1();
}
public static void m1() throws FileNotFoundException {
m2();
}
private static void m2() throws FileNotFoundException {
m3();
}
private static void m3() throws FileNotFoundException {
new FileInputStream("D:/x.txt");
}
}
- 上诉程序可以看出,从调用m3方法开始一直向上抛异常,直到m1方法出现了异常,并且采用的是上抛,再抛给main方法,最终抛给了JVM(java虚拟机),JVM遇到这个异常就会退出JVM,下面的"Hello World!"字符串字样就不会打印输出。
- 上述程序编译没有问题,打印输出信息如下
Exception in thread "main" java.io.FileNotFoundException: D:\x.txt (系统找不到指定的文件。)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at com.example.demo.exception.Test02.m3(Test02.java:27)
at com.example.demo.exception.Test02.m2(Test02.java:23)
at com.example.demo.exception.Test02.m1(Test02.java:19)
at com.example.demo.exception.Test02.main(Test02.java:13)
Process finished with exit code 1
- 可以看出在程序运行过程中发生了FileNotFoundException类型的异常
- JVM为我们创建了一个FileNotFoundException类型的对象
- 该对象中携带以下的信息
- JVM负责将该对象的信息打印到控制台
- 并且JVM停掉了程序的运行
如果对m1方法进行try…catch进行捕捉:
try {
m1();
} catch (FileNotFoundException e) {
System.out.println("假装处理了问题");
}
System.out.println("hello world");
可以看出,如果对m1方法进行try…catch处理,捕捉到了这个异常并且处理了这个异常,那么"Hello World!"就会打印输出
1.3 总结
- 使用throws处理异常不是真正处理异常而是推卸责任,如果想要处理该异常,使用try…catch进行捕捉,就不会抛给JVM而使程序异常退出