当尝试时,最后使用组合,如果有返回语句,请尝试。为什么最后是块执行?
class Palindrome
{
public static void main(String args[])
{
System.out.println(Palindrome.test());
}
public static int test()
{
try {
//return 0;
return 100;
}
finally {
System.out.println("finally trumps return.");
}
}
}
在上面的代码中,请告诉我执行流程。我知道最终将在try块之后强制执行。但是在try块中,返回staatement会将控件带到主类。在那种情况下,控制将如何最终阻止?
答案 0 :(得分:7)
“第一”是什么意思?
执行前finally
运行离开方法。什么时候应该运行?毕竟,这是方法的一部分。
但如果你有
int x = 1;
try{
return x;
} finally {
x = x + 1;
}
然后该方法仍然会返回1.因此return
语句确实在finally
块之前执行(以确定返回值)。
如果问题是为什么在所有上执行finally块,那么,这就是它们的用途:在“try”块完成后“最终”运行,无论如何什么
但是在try块中,return语句会将控件带到主类。在那种情况下,控制将如何最终阻止?
如何?嗯,这就是语言(和运行时)的工作方式。
在将控制流返回给调用方法之前,执行finally块。
技术上甚至可以选择更改返回值(通过拥有自己的return
语句),但强烈建议不要这样做。
答案 1 :(得分:1)
来自https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
最后一块是设计为始终执行:
当try块退出时,finally块始终执行。这个 确保即使意外发生也执行finally块 异常发生。但最终对于不仅仅是异常更有用 处理 - 它允许程序员避免使用清理代码 意外地被回归,继续或破坏。进行清理 finally块中的代码总是很好的做法,即使没有 预计有例外。
如果你在try块中返回并且finally块中的代码没有被执行,那么这不是“总是执行”。
如果我们在finally块中执行必要的操作(如解锁,清理资源),这会使代码更具可读性,这会阻止其他一些新程序员(或您自己)添加一些代码,这些代码会在try块中返回或引入异常,但不会清理资源
public static void main(String[] args) throws IOException {
InputStream is;
try {
is = getInpustStreamFromNetwork();
int i = 1 / 0;// 1. Intruduces exceptions
return;// 2. returns before clean up resources
} finally {
is.close();// clean up resources is important, so it is a good practice to put it into finally block even though there is no exceptions to catch.
System.out.println("no matter #1 or #2 ,this will be executed\n,");
}
}
答案 2 :(得分:0)
因为它是finally块的定义。无论块如何退出,它总是会发生。最后,对于应该始终执行的操作存在块,例如关闭打开的流和清理套接字连接。无论块如何退出,都应始终执行finally块中的代码。如果要在成功退出try块时跳过代码,则它属于具有适当异常类型的catch()块。
答案 3 :(得分:0)
来自https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
当try块退出时,finally块始终执行。这个 确保即使意外发生也执行finally块 异常发生。但最终对于不仅仅是异常更有用 处理 - 它允许程序员避免使用清理代码 被意外绕过返回,继续或休息。进行清理 finally块中的代码总是很好的做法,即使没有 预期例外
有些情况下,finally块可能无法执行。点击链接查看它们是什么。
因此,您的问题的答案是设计的。 Java旨在以这种方式工作。