今天在牛客网上练题时发现了一道有意思的题目,结果自己做错了,所以在博客上记录一下,加深一下印象。题目如下:
public class Test {
public static void main(String[] args) {try {
int i=100/0;
System.out.println(i);
}catch(Exception e){
System.out.println(1);
throw new RuntimeException();
}finally {
System.out.println(2);
}
System.out.println(3);
}
}
上面这段代码的输出是什么?
这个题实在牛客网上找来做的,我当时的答案选的是:1,(我的思路:try中有异常进入catch中先执行System.out.println(1);然后抛出异常就结束了。)可是自己测试之后结果如下:
然后我又试了下把throw new RuntimeException();语句注释掉,结果输出为:
紧接着我又把throw new RuntimeException();语句放在了finally块中,就会报错,把System.out.println(2);System.out.println(3);两条语句删除后就没有了。输出结果如下:
总结一下这里相关的知识。
finally块的作用是为了保证无论出现什么情况,finally块里的代码一定会被执行。(主要用来关闭连接,关闭文件等)即使try块或者catch块中有return,也还是先执行finally块中的内容然后再return。
但是finally块中的代码是不是一定会被执行呢?答案是不一定,那么在什么情况下会不执行finally块中的代码呢?
1.在try块之前就有异常抛出了。
2.在try块或者catch块中强制退出(System.exit(0);)
3.即非后台线程的结束而被强制执行的,原文链接:http://blog.csdn.net/General_du/article/details/9832635