Java finally catch try关键字
finally:
finally 关键字用来创建在 try 代码块后面执行的代码块;无论是否发生异常,finally 代码块中的代码总会被执行。
在 finally 代码块中,可以进行文件流关闭等收尾善后性质的语句
catch:
catch 关键字用于捕获异常并处理异常的代码块,通常与try关键字一起使用,可以使用多个 catch 代码块对异常进行多重捕获
try:
try 关键字用于包裹可能会抛出异常的代码块
使用示例:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型3 异常的变量名3){
// 程序代码
}finally{
// 程序代码,如关闭文件流等善后操作
}
上述代码也可以改写成下面这种try-with-resources格式
try (resource declaration) {
// 使用的资源
} catch (ExceptionType e) {
// 异常块
}
try-with-resources:
try-with-resources是一种异常处理机制,它能够自动关闭在 try 块中声明的资源,无需显式地在 finally 块中关闭(JDK7 之后)
常见面试题:
finally 和 catch代码块中return的执行顺序问题
public static void main(String[] args) {
System.out.println(a());
System.out.println("-----------------");
System.out.println(b());
System.out.println("-----------------");
System.out.println(c());
}
private static int a() {
try{
System.out.println(1/0);
}catch(Exception e){
System.out.println("catch is begin");
return 1 ;
}finally{
System.out.println("finally is begin");
}
return 0;
}
private static int b() {
try{
//待捕获代码
System.out.println(1/0);
}catch(Exception e){
System.out.println("catch is begin");
return 1 ;
}finally{
System.out.println("finally is begin");
return 2 ;
}
}
private static int c() {
try{
//待捕获代码
System.out.println(1/1);
}catch(Exception e){
System.out.println("catch is begin");
return 1 ;
}finally{
System.out.println("finally is begin");
return 2 ;
}
}
运行结果
catch is begin
finally is begin
1
-----------------
catch is begin
finally is begin
2
-----------------
1
finally is begin
2
依照这里的运行结果可以得出结论:
1、无论是否有异常,finally中的代码都会执行
2、有异常的情况下,如果catch和finally代码块中均有return,则catch中的return不会被执行(或者覆盖);如果catch代码块中有return,finally代码块中没有return,则catch中的return会被执行