转裁请注明本文地址啊^_^
在《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间根本停不下来啦!
(完)