尝试,最后在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旨在以这种方式工作。