6、异常处理
异常处理
所有异常的超类:java.lang.Throwable,分为Error和Exception两大类,前者是致命的,一般会终止线程,后者应该尽可能处理
程序一旦发生异常,则,异常点后的语句将停止执行。
如果不存在这种异常的捕获语句,则,以后的代码都将停止执行,程序“崩溃”,由JVM接手处理异常;如果存在,则,转而执行异常捕获语句块中的代码;并继续执行异常捕获语句块的后续代码,程序不会崩溃!
有三种情况:
- 发生异常无捕获:异常后面的语句都不执行
- 捕获但无异常:正常执行代码(除了catch的代码)
- 捕获发生异常:执行try发生异常的语句和catch的语句和finally语句(如果存在)以及try-catch后的语句(try中发生异常的语句后将跳过去执行catch语句)
1.运行时异常和非运行时异常
- 检查性异常(非运行时异常):编程时检查的,用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在的文件时,这种异常编译器大多会提示我们
- 运行时异常:运行时检查的,可能被程序员避免的异常,这些异常可以再编译时被忽略,例如:1/0
- 错误ERROR:错误是脱离程序员控制的问题,大多数是虚拟机生成并抛出,通常在代码中被忽略,例如:栈溢出,Java虚拟机运行错误
编译器要求程序员必须对非运行时异常(又称为检查性异常)进行“捕获”,否则不能通过编译,而运行时异常编译器不要求捕获
2.自定义异常
用Exception类可以派生出“检查类异常”类
用RuntimeException可以派生出“运行时异常”类
通常建议应以检查类异常,可以强制程序员捕获处理
给我们的方法加上异常处理:
public class ExceptionGeekLee extends Exception {
public ExceptionGeekLee() {
System.out.println("a不能大于10");
}
}
public class Student {
static void test(int a) throws ExceptionGeekLee {
if (a > 10){
throw new ExceptionGeekLee();
}
}
}
public class Main {
public static void main(String[] args) {
try {
Student.test(11);
} catch (ExceptionGeekLee e) {
}
}
}
结果:

我们在调用增加了异常的方法后,需要进行处理:捕获或者抛出
3. 异常捕获和抛出的选择
简单的处理异常的原则:能处理则处理,不能处理则抛出。
一般来说,对于某种异常,如果本方法有处理他的安排,那么就捕获;
一种情况是,如果这种异常不影响后续代码的逻辑和执行,那么捕获什么都不处理即可;
另一种情况是,严重影响后续代码执行,那么就把这个异常抛出。
4. fianlly关键字
这个关键字是在catch后的代码块,不管发不发生异常,都会执行的代码块,他的意义是:在发生异常后,做一些必要的操作,如:关闭打开的资源等等。

浙公网安备 33010602011771号