您的位置:首页 > 编程语言 > Java开发

《Java Puzzlers》学习笔记之异常处理:finally中使用跳转语句的后果

2015-02-06 17:18 423 查看
转裁请注明本文地址啊^_^

在《Java Puzzles - Puzzle 36:Indecision》中,通过例子详细的讨论了异常处理finally作用域使用return的后果,并且引申说明,finally作用域里还不应该使用break和continue这个跳转语句。那如果在finally作用域里使用了break或continue会怎样呢?

先看看使用break会怎样。码个例子先:


import java.io.*;

public class ExceptionIndecisionTest
{
static int indecisionException()
{
while(true)
{
try
{
System.out.println("try block");
throw new Exception();
}
catch(Exception e)
{
System.out.println("catch Exception");
}
finally
{
System.out.println("finally block");
break;
}
}
System.out.println("out block");
return 2;
}

public static void main(String[] args)
{
System.out.println("return val = "+indecisionException());
}
}


编译运行:



可以看到,代码按照try-catch-finally的顺序运行完后并没有退出方法,而是跳出finally运行剩下的代码

其实还可以进一步改造这个代码

import java.io.*;

public class ExceptionIndecisionTest
{
/*
* 增加异常抛出
*/
static int indecisionException() throws Exception
{
while(true)
{
try
{
System.out.println("try block");
throw new Exception();
//return 0;
}
/*
* 这里不处理异常,由调用者处理
*/
/*catch(Exception e)
{
System.out.println("catch Exception");
}*/
finally
{
System.out.println("finally block");

//return 1;
//continue;
break;
}
}

System.out.println("out block");
return 2;
}

public static void main(String[] args)
{
/*
* 增加异常处理
*/
try
{
System.out.println("return val = " + indecisionException());
}
catch(Exception e)
{
System.out.println("catch Exception");
}
}
}


编译运行:



呐呢!通过结果可以看到,代码不仅没有在运行完finally后退出indecisionException方法,而且此方法的调用者还没能捕获到抛出的异常。

那么把break语句换成continue又会更怎样呢?小伙伴们应该能脑补到结果吧——代码会在while-continue间根本停不下来啦!

(完)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: