Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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_Finally - Fatal编程技术网

Java 尝试捕捉最终返回澄清

Java 尝试捕捉最终返回澄清,java,return,try-catch,finally,Java,Return,Try Catch,Finally,通过阅读本论坛中与上述主题相关的所有问题(见标题),我完全理解,最终总是被呼叫。(从系统退出和无限循环除外)。但是,我想知道是否在catch块中调用了一个return,然后从finally块调用了另一个return 例如: public static void main(String[]args) { int a = new TestClass().absorbeTheValue(); } int absorbeTheValue() { try { int a

通过阅读本论坛中与上述主题相关的所有问题(见标题),我完全理解,
最终
总是被呼叫。(从
系统退出和无限循环除外)。但是,我想知道是否在catch块中调用了一个
return
,然后从finally块调用了另一个
return

例如:

public static void main(String[]args) {
    int a = new TestClass().absorbeTheValue();
}

int absorbeTheValue() {
    try {
        int a = 10/0;
        if (a > 0) return 4;
    } catch(Exception e) {
        return 45;
    } finally {
        return 34;
    }
}    
所以这里的输出(当调用方法时)在任何情况下都是34。这意味着最后总是会跑掉。我认为其他的“回报”根本没有运行。在许多帖子中,我发现了这样一个事实,即最终将内容写在catch子句return已经编写的内容之上。我的理解是,只要catch子句中的返回值即将被计算,控制流就会传递给finally子句,finally子句又有另一个返回,这次将对返回进行计算,而不会将控制权传递回catch子句。这样,在运行时调用的唯一
return
将是finally return。你同意吗


finally
中的
return
不会将控件传回程序,而是返回值并终止该方法。我们可以这么说吗?

如果到达
try
块中的
返回
,它将控制权转移到
finally
块,函数最终正常返回(不是抛出)

如果出现异常,但随后代码从
catch
块到达
return
,控制权将转移到
finally
块,函数最终正常返回(不是抛出)

在您的示例中,在
finally
中有一个
return
,因此无论发生什么,函数都将返回
34
,因为
finally
具有finally(如果愿意)单词

尽管您的示例中没有介绍,但即使您没有
捕获
并且
try
块中抛出异常且未捕获,这也是正确的。通过从
finally
块执行
返回
,可以完全抑制异常。考虑:

public class FinallyReturn {
  public static final void main(String[] args) {
    System.out.println(foo(args));
  }

  private static int foo(String[] args) {
    try {
      int n = Integer.parseInt(args[0]);
      return n;
    }
    finally {
      return 42;
    }
  }
}
如果在不提供任何参数的情况下运行:

$ java FinallyReturn $java FinallyReturn …在
foo
中的代码抛出
ArrayIndexOutOfBoundsException
。但是,由于
finally
块执行
返回
,因此该异常被抑制


这就是为什么最好避免在
finally

中使用
return
的原因之一。下面是一些代码,展示了它的工作原理

class Test
{
    public static void main(String args[]) 
    { 
        System.out.println(Test.test()); 
    }

    public static String test()
    {
        try {
            System.out.println("try");
            throw new Exception();
        } catch(Exception e) {
            System.out.println("catch");
            return "return"; 
        } finally {  
            System.out.println("finally");
            return "return in finally"; 
        }
    }
}
结果是:

try
catch
finally
return in finally

请缩进您的代码。另请参见:您的问题是什么?+1简单易懂,并教会了我一些新的东西:)@LoganDam T.J.Crowder给出了一个非常好的解释。@LoganDam:这是一个很好的操作顺序的清晰解释。然而,它没有回答所提出的问题。该问题明确询问当
finally
块包含
return
语句时会发生什么。@unholycsampler good catch,我更新了答案。谢谢。我又学到了一些新东西。。。坚持下去,伙计们!需要注意的是,出于这些目的,
throw
可以与
return
互换。(例如,
抛出新异常(4)
抛出新异常(34)
)我只想插嘴一下user1442960所说的话。JLS并没有提到在一次捕获或最终捕获中的返回。它使用术语“突然”,我猜这意味着异常或返回。@Steve11235:不,来自
catch
块的
return
将“正常地”完成,而不是“突然地”。这一点从以下几点可以很清楚地看出:在抛出异常的过程中,Java虚拟机会一个接一个地突然完成在当前线程中已开始执行但尚未完成的任何表达式、语句、方法和构造函数调用、初始值设定项以及字段初始化表达式