我想知道finally块中的代码和finally块
之后的代码之间有什么区别答案 0 :(得分:6)
一个小的测试程序显示了差异:
public class FinallyTest {
public static void main(String[] args) throws Exception {
try {
boolean flag = true;
if (flag) {
throw new Exception("hello");
}
} finally {
System.out.println("this will get printed");
}
System.out.println("this won't show up");
}
}
打印
this will get printed
Exception in thread "main" java.lang.Exception: hello
at snippet.FinallyTest.main(FinallyTest.java:7)
一旦抛出异常,该线程将执行的唯一事情(直到异常被捕获)才是finally块(异常将离开最终所属的try-block)。
答案 1 :(得分:2)
如果catch块重新抛出异常(或抛出一个异常),则执行finally块。在finally块之后的任何内容都不会被执行。
当try块退出时,finally块始终执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中始终是一种很好的做法,即使没有预期的例外情况也是如此。 - http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
答案 2 :(得分:2)
如果在catch块上抛出异常,或者在try块上返回一些内容,它将执行finally块。如果没有在finally块上(在try / catch / finally之后)它将无法工作。这是一个简单的例子供您理解:在没有finally块的情况下尝试它,您将看到它打印消息的行"关闭资源..."将永远不会被执行。
try {
return "Something";
} catch (Exception e) {
throw e;
} finally {
System.out.println("Closing resources (Connections, etc.)...");//This will always execute
}
答案 3 :(得分:1)
在这里,我将在上面提供的示例中添加更多内容,可能会在将来对某人有所帮助,并希望避免某些混乱。
开始吧。
实际上,这取决于程序的流控制。这意味着如果程序的编写方式是:如果您的代码正在处理try块中引发的异常,并且如果您在catch块中对其进行处理,则finally块之后的代码将在finally块中的代码之后执行
示例1:,此处已处理了异常,因此最终执行了块之后的代码。
public class TestFinally {
public static void main(String[] args) throws Exception {
try {
boolean flag = true;
if (flag) {
throw new Exception("hello");
}
}
catch(Exception e){
System.out.println("catch will get printed");
}
finally {
System.out.println("this will get printed");
}
System.out.println("this won't show up");
}
}
结果:
catch will get printed
this will get printed
this won't show up
示例2 :如果try块中的异常未按照上述Nathan的说明正确处理,则不会执行finally块之后的代码。
public class TestFinally {
public static void main(String[] args) throws Exception {
try {
boolean flag = true;
if (flag) {
throw new Exception("hello");
}
}
// not handling the exception thrown above
/*catch(Exception e){
System.out.println("catch will get printed");
}*/
finally {
System.out.println("this will get printed");
}
System.out.println("this won't show up");
}
}
结果:
this will get printed
Exception in thread "main" java.lang.Exception: hello
at com.test.TestFinally.main(TestFinally.java:36)
因此,总而言之,总的来说, finally 块中的代码将始终执行,除非在某些情况下线程在 finally 块之前被停止或终止或如果在try块中编写了任何退出程序。而最终的代码取决于在try-catch-finally块中编写的代码和异常处理。