尝试,最后在try块中返回执行流程

尝试时,最后使用组合,如果有返回语句,请尝试。为什么最后是块执行?


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会将控件带到主类。 在那种情况下,控制将如何最终阻止?

你是什​​么意思“第一”?

finally在执行之前运行离开方法。 什么时候应该运行? 毕竟,这是方法的一部分。

但如果你有

 int x = 1; try{ return x; } finally { x = x + 1; } 

然后该方法仍将返回1.因此, return语句确实在finally块之前以某种方式执行(以确定返回值)。

如果问题是为什么finally块执行完全,那就是它们的用途:在“try”块完成之后“终于”运行, 无论如何

但是在try块中,return语句会将控件带到主类。 在那种情况下,控制将如何最终阻止?

怎么样? 嗯,这就是语言(和运行时)的工作方式。

在将控制流返回给调用方法之前,执行finally块。

它在技术上甚至可以选择更改返回值(通过拥有自己的return语句),但这是非常不鼓励的。

来自https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

最后一块是设计为始终执行:

当try块退出时,finally块总是执行。 这确保即使发生意外exception也会执行finally块。 但最终不仅仅是exception处理有用 – 它允许程序员避免因返回,继续或中断而意外绕过清理代码 。 将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。

如果你在try块中返回并且finally块中的代码没有被执行,那么这不是“总是执行”。

如果我们在finally块中执行必要的操作(例如解锁锁定,清理资源),这会使代码更具可读性,这会阻止其他一些新程序员(或您自己)添加一些代码,这些代码在try块中返回或引入exception,但不会清理资源。

 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,"); } } 

因为那是finally块的定义。 无论块如何退出,它总是会发生。 最后,对于应该始终执行的操作存在块,例如关闭打开的流和清理套接字连接。 无论块如何退出,都应始终执行finally块中的代码。 如果要在成功退出try块时跳过代码,则它属于具有适当exception类型的catch()块。

来自https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

当try块退出时,finally块总是执行。 这确保即使发生意外exception也会执行finally块。 但最终不仅仅是exception处理有用 – 它允许程序员避免因返回,继续或中断而意外绕过清理代码。 将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此

有些情况下,finally块可能无法执行。 点击链接查看这些内容。

因此,您的问题的答案是设计的。 Java旨在以这种方式工作。