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

时间:2014-11-25 02:23:51

标签: java return try-catch finally

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


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

4 个答案:

答案 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旨在以这种方式工作。