finally 块中的代码什么时候被执行?
(1)如果try{}语句块中有return语句,而finally{}语句块中没有return语句时,finally{}块中的代码在return语句前执行。
因为:由于程序执行return语句就意味着结束对当前函数的调用并跳出这个函数体,因此任何语句要执行都只能在return前执行,因此finally块里代码也是在return前执行的。
(2)如果在try{}语句块和finally语句块都有return语句时,finally语句块中的return语句将会覆盖函数中其他return语句。
以下方法返回什么?
private static String extracted1() {
try {
int i = 10 / 0;
return "ok";
} catch (Exception e) {
System.out.println("exception");
return "exception";
} finally {
System.out.println("finally");
return "finally";
}
}
以下方法返回什么?
private static String extracted2() {
try {
return "ok";
} catch (Exception e) {
System.out.println("exception");
return "exception";
} finally {
System.out.println("finally");
return "finally";
}
}
try-catch-finally 中那个部分可以省略?
try后面至少得有其一
Error 和 Exception 的区别?
运行时异常与受检异常有何异同?
throw 和 throws 的区别?
throw:当前方法向外抛异常
throws:声明当前方法可能会抛出一个或者多个异常
常见的异常类有哪些?
NullPointerException
ClassCastException
数组下标越界异常:ArrayIndexOutOfBoundsException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
方法未找到异常:NoSuchMethodException
java.lang.OutOfMemoryError
java.lang.StackOverflowError
主线程可以捕获到子线程的异常吗?
正常情况下,如果不做特殊的处理,在主线程中是不能够捕获到子线程中的异常的。
public static void main(String[] args) {
try {
new Thread(() -> {
int i = 10 / 0;
}).start();
} catch (Exception e) {
// 不会执行
System.out.println("子线程发生了异常");
}
}