final、finally和finalize(二)
finally adv. 最后;终于;决定性地
所以 finally 一般用来在程序的末尾进行释放资源,对异常处理的补充。
只要 try 执行了,finally 块里的语句就一定会执行,并且在 return 之前执行,但是这里有个条件就是虚拟机没有退出。
例如:
try { System.out.println("start"); return; } finally { System.out.println("end"); }
程序输出:
start
end
但是如果把程序改成这样:
try { System.out.println("start"); // return; System.exit(0); } finally { System.out.println("end"); }
则程序输出start 后直接退出。
这时候可能有些和我一样的菜鸟第一次见到这时会有些疑问,不是说finally 里的语句总是会执行么,怎么没执行呢?
答案就是虽然java规定是这样的,无论是否发生异常finally里的语句都会执行,但是就像树木生长要依赖于土地一样,java类的运行也要依赖于java虚拟机的存在,当执行第5行System.exit(0); 时,导致虚拟机直接退出了,相当于树木没有了赖以生存的土壤,或者说程序在执行的时候突然没有电了,那 finally 的本事再大,里边的语句也不会执行啊。
另外,有try 不一定就要有 catch ,只有try 和 finally 的情况下也不是报错的,只是抛出异常时没有捕获而已。