Java学习分享-try...catch...finally语句块使用详解
在异常这一章节的学习中,对异常的捕获处理主要涉及三个关键字:try、catch、finally,写这篇博文的出发点是基于下面的这道多选题
说实话,本人在做的过程中,对于B,C,D选项是拿捏不定的,说明对于try-catch-finally语句块的使用还是理解不够,下面带着疑问先对try、catch、finally三个关键词做进一步的认识,后面对上面的选项逐个验证。如有不对之处,欢迎指正~
一、try、catch、finally三个关键词的含义
try
try用于监听可能会抛出异常的代码,将要被监听的代码放在try语句块之内。
catch
用于捕获try语句块中发生的异常,catch()后面的()中传入异常参数,表明该catch语句块中要处理的异常类型,catch块不能单独使用,必须始终和try块在一起使用。
1、catch后面的()中的异常类型可以是和try中可能抛出异常的代码块相匹配的具体的异常类型,也可以是该异常的父类型(多态)
2、如果有多个异常,也可以在try后面跟多个catch语句块对各个异常分别进行捕获处理
说明:
所以要注意的是,子类型的异常要放在父类型的异常前面,否则后面的捕获子类型的异常的catch语句块因为永远执行不到会报错!
finally
finally语句块为异常处理提供了一个统一的出口,异常机制保证了无论try中的监听语句是否抛出异常,finally中的代码总是会被执行。因此可以将那些在任何情况下都要被执行的代码放在finally中,主要用于回收在try语句块中打开的资源,比如数据库连接,文件等,必须将释放这些资源的代码写入finally块中。
public class Demo1 {
public static void main(String[] args) {
System.out.println(demo());
}
public static int demo() {
int i=100;
try {
return i/2;
}finally {
i++;
System.out.println("finally子句");
}
}
}
运行结果:
可以看到finllay子句也执行了,但是最终i的值是50,并不是101或者51,为什么呢?
分析:Java中有两条规则不可破坏:
finally
子句是在return
后面的表达式i/2
运算完之后执行的,此时并没有立即给调用者返回运算后的值,而是先把要返回的值保存起来,继续执行finally
中的代码,不管finally
中对要返回的值涉及的变量如何影响,最后返回的都是在执行finally
之前保存的值。执行完finally
里面的代码后,return
返回之前保存的值,方法体结束。这样既保证了代码自上而下的执行顺序,又能保证finally
被执行到,return
所以上面的B选项
finally不可以单独使用,必须和try语句块一起出现。所以上面的D选项
这个答案也是显而易见的,catch语句块就是为了捕获异常的,不能单独使用,必须和try语句块始终在一起,用来捕获try中监听代码可能出现的异常。所以上面的C选项
现在再回头看一下前面的多选题,答案清晰了许多~
总结:在try...catch...finally语句块中
-
try不能单独使用,要么try-catch-finally,要么try-catch,要么try-finally
-
catch不能单独使用,必须和try联合使用,一个try可以有多个catch
-
finally不能单独使用,必须和try联合使用
上面就是本人对try-catch-finally语句块的理解,可能比较啰嗦,但个人认为只有一一解决疑虑之后,才可以印象深刻。如有理解不当之处,欢迎指正~
注:本文是在学习完华为云课堂的异常章节课程和参考网上优秀博文之后,再结合个人理解写的,此处表示感谢!
- 点赞
- 收藏
- 关注作者
评论(0)