Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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中,如果try和catch都抛出相同的异常并最终返回,会怎么样?_Java_Exception Handling - Fatal编程技术网

在java中,如果try和catch都抛出相同的异常并最终返回,会怎么样?

在java中,如果try和catch都抛出相同的异常并最终返回,会怎么样?,java,exception-handling,Java,Exception Handling,为什么返回值是4?这就是最终的工作方式。片段 public class Abc { public static void main(String args[]) { System.out.println(Abc.method()); } static int method() { try { throw new Exception(); } catch(Exception e) {

为什么返回值是4?

这就是
最终的工作方式。片段

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

    static int method() {
        try {
            throw new Exception();
        }
        catch(Exception e) {
            throw new Exception();
        }
        finally {
            return 4;
        }
    }
}
将突然完成,但finally子句将生效,当它返回时,将放弃完成语句的原始原因

Java语言规范的第节对此进行了解释。我已经强调了与您的情况相关的路径:

一个
try
语句
最后执行
块 首先执行
try
block。还有 选择:

如果 执行
try
块正常完成,然后
最后
块是 执行,然后有一个选择:
  • 如果执行 在
    try
    块的 由于一个错误而突然完成
    抛出一个值
    五、 还有一个选择:
    如果
    V的运行时类型为
    可分配给任何
    
    catch
    条款
    尝试
    语句,然后 第一个(最左边的)这样的
    catch
    子句被选中。 将值V指定给 所选对象的参数
    catch
    子句,以及 一块 执行catch
    子句。 还有一个选择:
    • 如果
      catch
      块完成 通常情况下
      最后
      块是 执行。还有一个选择:
      • 如果
        catch
        块完成 突然因为R的原因,然后
        最后
        块是 执行。还有一个选择:
        • 如果
          最后
          块完成 正常情况下,然后
          尝试
          
          语句突然完成
          原因R。
          
        • 如果
          最后
          块因某种原因突然完成 S、 然后按下
          键,尝试
          
          语句突然完成
          原因S(和原因R)
          被丢弃)。
          
    • 如果运行时类型为V 不可分配给的参数 合同的任何
      catch
      条款
      尝试
      语句,然后
      最后
      块是 执行。还有一个选择:
  • 如果执行
    try
    块完成 出于任何其他原因突然 R、 然后
    最后
    块是 执行。还有一个选择:
    • 。。。

    你不应该从最后一个街区回来。这是非常糟糕的做法。请参见和。

    关于StakOverflow,有几个问题可以解释这一点


    简单一点:如果在finally子句中放入return或throw语句,这是方法的最后一个操作。但总的来说,这是一种不好的做法

    finally块返回值的事实导致抛出的异常被吞没,因此它不会传播到方法之外。

    finally将始终返回4。无论try和catch块中抛出任何异常,finally块都将始终执行。

    try块用于执行某些任务,如果任务无法完成,v则从catch块中抛出异常。您不应该在try中抛出异常。+1,比我想知道的更多的细节。如果在
    try
    中有一个
    return
    ,会发生什么?finally仍然会启动并放弃前面完成语句的原因。在您的示例中没有
    finally
    try {
        throw new Exception();
    } catch(Exception e) {
        throw new Exception();
    }