一,异常的顶级父类是Throwable类。
其下有两个子类:Error类和Exception类
Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),运行时异常;ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用try。。。catch捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。
二,
try和finally中都有return语句,执行哪一个return?
参考该博客:https://www.cnblogs.com/tian-ci/p/10543073.html
try 中的 return 语句调用的函数先于 finally 中调用的函数执行,也就是说 try 中的 return
语句先执行,finally 语句后执行,但try中的 return 并不是让函数马上返回结果,而是 return
语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行 finally 语句后才真正开始返回。但此时会出现两种情况: ①
如果finally中也有return,则会直接返回finally中的return结果,并终止程序,函数栈中的return不会被完成 ②
如果finally中没有return,则在执行完finally中的代码之后,会将函数栈中保存的try return的内容返回并终止程序
注意: 1、不管有没有出现异常,finally块中代码都会执行 2、当try和catch中有return时,finally仍然会执行
3、finally是在try中return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值
举个栗子:
public class temp {
public static void main(String[] args) {
int a = test();
System.out.println("a=" +a);
}
public static int test() {
int a = 11;
try {
a = 1;
return a++;
} catch (Exception e) {
System.out.println("test");
} finally {
int b = 2; // 【A】
++a;
// System.out.println("a=" +a);
}
return a + 1; // 必需,要不然编译错误
}
}
输出为:1
因为在try里时,return的值是1.但它不会马上返回,而是会将a=1的结果保存在函数栈里。
运行完try后,a=2.接着运行finally,a=3.
最后返回到try块,返回已保存的结果1。但实际上函数里的结果已经是3了。