Java面试准备——异常处理
本文学习自GitHub上的JavaGuide项目,感谢大佬的资源,此处为自我学习与整理,原项目链接 JavaGuide
Java异常类层次结构图
- Java中所有的异常都有一个祖先java.lang.Throwable。Throwable有两个重要子类Error和Exception。
- Error表示程序无法处理的错误,是运行时较为严重的问题。大多数错误于代码编写者的执行无关,而是运行JVM时出现的错误。比如JVM运行操作时内存不够用了,会出现OutOfMemoryError。这些错误出现时JVM一般会终止线程。
- Exception是程序本身可以处理的异常。RuntimeException由JVM抛出,NullPointerException是要访问的变量没有引用对象,ArithmeticException是算术运算异常,ArrayIndexOutOfBoundaryException下标越界。
- 异常可以处理,错误不能处理
Throwable类常用方法
- public String getMessage() 返回异常发生时的简要描述
- public String toString() 返回异常发生时的详细信息
- public String getLocalizedMessage() 返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以生成本地化信息。如果没有覆盖方法,和getMessage()返回结果相同。
- public void printStackTrace() 在console上打印Throwable对象封装的异常信息
try,catch,finally
- try块用于捕捉异常,后面可以有零个或者多个catch块,如果是零个,必须接finally块
- catch块用于处理try中捕获的异常
- finally块无论是否捕获和处理异常都会执行,如果try和catch中会return,则finally在return之前执行。
- 在以下情况,finally不会被执行:
(1) CPU关闭
(2)进程死亡
(3)finally块的第一行发生异常
(4)前面的代码中调用了System.exit(int),并且在异常语句之前 - finally会在try和catch的return之前执行,并且如果finally有return,则会覆盖别的return。
代码示例:
public class test {
public static int test(int i){
try{
int res = 10/i;
return res;
}catch (Exception e){
e.printStackTrace();
return i++;
}
finally {
i=100;
return i;
}
}
public static void main(String[] args) {
int res=test(0);
System.out.println(res);
}
}
输入为0时:
输入为1时输出仍为100,原因是finally的return覆盖了try和catch的return。