先来看牛客上的一道题
public class TestDemo {
public static String output ="";
public static void foo(int i){
try{
if(i == 1){
throw new Exception();
}
}catch(Exception e){
output += "2";
return ;
}finally{
output += "3";
}
output += "4";
}
public static void main(String[] args) {
foo(0);
foo(1);
System.out.println(output);
}
}
当执行foo(0)时,首先进入try块,不满足,继而进入finally,最后执行try-catch-finally外部的代码,以是output变为“34”,
然后是foo(1),进入try块,try中抛出异常,有匹配的catch语句,则catch语句捕捉,然后,由于catch中有return语句,则return要在finally执行后再执行;try-catch-finally之外的代码就不再执行了(由于有return打断),以是最终output的值为“3423”
若是这个例子中的catch语句没有return,那么输出的效果就应该是“34234”.
今后例可以看出亮点:
1、try中没有抛出异常,则catch语句不执行,若是有finally语句,则接着执行finally语句,继而接着执行finally之后的语句;
2.不管是否try...catch,finally都市被执行。当try...catch中有return的话,finally后会执行try...catch中的return,然后不再执行后续语句。也就是说finally字句中的语句总会执行,纵然有return语句,也是在return之前执行。
3、另有一点:finally前有return、finally块中也有return,先执行前面的return,保留下来,再执行finally的return,笼罩之前的效果,并返回。
再一个例子
public class Test
{
public static int aMethod(int i)throws Exception
{
try{
return i / 10;
}
catch (Exception ex)
{
throw new Exception("exception in a Method");
} finally{
System.out.printf("finally");
}
}
public static void main(String [] args)
{
try
{
aMethod(0);
}
catch (Exception ex)
{
System.out.printf("exception in main");
}
System.out.printf("finished");
}
}
此题输出效果为 finally finished
若是将aMethod中的i/10换成10/i,则输出效果为 finally exception in main finished
1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入
2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各种产物的最新流动,优惠券领取点击进入
3.广告同盟: 整理了现在主流的广告同盟平台,若是你有流量,可以作为参考选择适合你的平台点击进入
链接: http://www.fly63.com/article/detial/2445