Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最后尝试捕捉,然后返回_Java_Return_Try Catch_Try Catch Finally_Finally - Fatal编程技术网

Java 最后尝试捕捉,然后返回

Java 最后尝试捕捉,然后返回,java,return,try-catch,try-catch-finally,finally,Java,Return,Try Catch,Try Catch Finally,Finally,我知道try、catch和finally是如何工作的(大部分情况下),但我想知道一件事:try-catch-finally之后的return语句会发生什么,而try(或catch)中已经有了return 例如: public boolean someMethod(){ boolean finished = false; try{ // do something return true; } catch(someException e

我知道try、catch和finally是如何工作的(大部分情况下),但我想知道一件事:try-catch-finally之后的return语句会发生什么,而try(或catch)中已经有了return

例如:

public boolean someMethod(){
    boolean finished = false;
    try{
        // do something
        return true;
    }
    catch(someException e){
        // do something
    }
    finally{
        // do something
    }
    return finished;
}
让我们假设在尝试中没有出错,所以我们返回true。然后我们将进入最后一步,在那里我们做一些事情,比如关闭一个连接,然后呢

我们在finally中做了一些事情之后,该方法会停止(因此,该方法在try中返回true),还是该方法会在finally之后继续,导致返回finished(这是false)


提前感谢您的回复。

在这种情况下,将运行finally中的代码,但如果没有异常,将跳过另一个返回。 您也可以通过记录以下内容自己看到这一点:)

另请参见有关
系统的内容。退出

最后,请看《从一个地方回来》一文:

如果一切顺利,在执行
finally
块后执行
try
时返回


如果
try
内部出现问题,则捕获并执行
异常,然后执行
最后执行
块,然后执行该块之后的返回。

try内部的代码肯定会执行。。但当它到达返回语句时。。它将移动到finally块,而不执行try块中的return语句。。然后执行finally的代码,然后执行try的return语句

public int Demo1()
    {
        try{
            System.out.println("TRY");
            throw new Exception();
            }catch(Exception e){
                System.out.println("CATCH");
            }finally{
                System.out.println("FINALLY");
            }return 0;

    }
调用此方法的输出如下所示

TRY
CATCH
FINALLY
0

意味着考虑<代码>尝试{}} catch {}最后{}} /Case>作为在这个特定情况下逐个执行的语句序列。


然后控制返回。

执行finally块的事实不会使程序忘记返回的内容。如果一切顺利,finally块之后的代码将不会执行

下面是一个例子,说明了这一点:

public class Main {

    public static void main(String[] args) {
        System.out.println("Normal: " + testNormal());
        System.out.println("Exception: " + testException());
    }

    public static int testNormal() {
        try {
            // no exception
            return 0;
        } catch (Exception e) {
            System.out.println("[normal] Exception caught");
        } finally {
            System.out.println("[normal] Finally");
        }
        System.out.println("[normal] Rest of code");
        return -1;
    }

    public static int testException() {
        try {
            throw new Exception();
        } catch (Exception e) {
            System.out.println("[except] Exception caught");
        } finally {
            System.out.println("[except] Finally");
        }
        System.out.println("[except] Rest of code");
        return -1;
    }

}
输出:

[normal] Finally
Normal: 0
[except] Exception caught
[except] Finally
[except] Rest of code
Exception: -1

为什么你不能直接执行代码,看看它返回什么值呢?因为他在一条总线上,只是想知道^^“那个案例”的意思是“没有例外”,而“另一个返回”是在finally块之后的,对吗?(为了说明这一点)@Fildor如果出现异常,将使用第二次返回,但仍然执行finally块。正如我所说的,你可以在main中的一个小程序中自己尝试这样做,看看system.out、logging或断点会发生什么,我知道这一点。我刚刚发现你使用的措辞有点模棱两可…@Fildor是的,我只是毫无例外地讲述了这个案例,因为我认为这是最有趣的。这是Java 7之前关闭资源的默认方法(使用finally)。如果我没记错的话,建议不要在try中返回,但是您应该设置
finished
,并让它只返回一个位置。@JqueryLearner什么让您认为它不可访问?@JqueryLearner finally块不是结束。试试看。之后的所有代码都将是完全可访问的。最终什么也没有返回。它只是一个代码块,执行时不知道是否存在异常。@JqueryLearner,但原因不同。将返回放到finally中,并在tryblock中放置一些实际上可能引发异常的内容。它将编译并运行。@JqueryLearner,因为您在finally块中放置了一个返回。这使得后面的所有内容都无法访问。@Fildor这是我的错,我认为OP在finally块中也有返回语句。所以所有这些讨论都没有用。Sorry@Narendra11744如果你不知道结果,请尝试一些代码,但请不要给出错误的答案。如果没有发生异常,在finally块之后,将执行try中的return语句,而不执行其他语句。