java try catch finally-返回

java try catch finally-返回,java,Java,尝试一个try-catch-finally用例- public class Finallyy { public static void main(String[] args) { int result = method1(); System.out.println(result); } private static int method1() { int a = 2; try { i

尝试一个try-catch-finally用例-

public class Finallyy {
    public static void main(String[] args) {
        int result = method1();
        System.out.println(result);
    }

    private static int method1() {
        int a = 2;
        try {
            int b = 0;
            a = a / a;
            System.out.println("try");
            return a;
        } catch (Exception e) {
            System.out.println("caught");
            a = 5;
            return a;
        }
        finally {
            System.out.println("finally");
            a = 10;
            return a;
        }
    }
}
输出:

try

finally

10
try

finally

1
如果代码修改为

输出:

try

finally

10
try

finally

1
问题-是否存在堆栈的概念,其中存储了
try
块中的“
返回一个
”[如果更改了示例,则它适用于try或catch块],并且当控件仅在
finally
块中没有“
返回
”时才会弹出堆栈

更新:解决方案结束:

执行return语句时,将存储要返回的值。当finally块完成时,返回该值


finally块始终作为last执行。因此,finally块中的返回覆盖try/catch块中的其他返回。因此,从finally块返回或抛出异常是一种非常糟糕的做法

那么,对于最初的问题,是否只有在
finally
块中没有“
返回”的情况下?不,没关系

编辑:

try

finally

10
try

finally

1

这个问题是在4月8日提出的,已经得到了回答。目前与此一起标记为重复的问题是在稍后的日期【8月15日】提出的问题。因此,新问题将被标记为重复问题,而不是本问题。然而,分享一个类似问题的参考是好的

finally块始终作为last执行。因此,finally块中的返回覆盖try/catch块中的其他返回。 因此,从finally块返回或抛出异常是一种非常糟糕的做法

与堆栈无关:事实上,finally块始终作为last块执行,所以finally块中返回或抛出的内容将擦除并覆盖任何以前的退出值(返回的对象或抛出的异常)

试试这个:

try {
    throw new NullPointerException();
}
finally {
    return 0;
}

finally块中的
返回将覆盖(吞没)NullPointerException…

finally块始终作为last执行。因此,finally块中的返回覆盖try/catch块中的其他返回。 因此,从finally块返回或抛出异常是一种非常糟糕的做法

与堆栈无关:事实上,finally块始终作为last块执行,所以finally块中返回或抛出的内容将擦除并覆盖任何以前的退出值(返回的对象或抛出的异常)

试试这个:

try {
    throw new NullPointerException();
}
finally {
    return 0;
}

finally块中的
返回
将覆盖(吞没)NullPointerException…

在其
finally
块之前执行
try

执行
return
语句时,将存储要返回的值。当
最后
块完成时,返回该值

请注意,
a
不是一个值
a
是存储值的变量。如果更改
a
,则更改
a
,则不会更改为
返回值存储的值

出于技术原因,我们去

如果try块的执行由于任何其他原因突然完成 R、 然后执行finally块,然后有一个选项:

  • 如果finally块正常完成,那么try语句由于原因R而突然完成

  • 如果finally块因原因S而突然完成,则try语句因原因S而突然完成(,并且原因R被丢弃


因此,如果带有
finally
try
具有
return
并且
finally
也具有
return
,那么
finally
return
将取代
try
块。

try
块在其
finally
块之前执行

执行
return
语句时,将存储要返回的值。当
最后
块完成时,返回该值

请注意,
a
不是一个值
a
是存储值的变量。如果更改
a
,则更改
a
,则不会更改为
返回值存储的值

出于技术原因,我们去

如果try块的执行由于任何其他原因突然完成 R、 然后执行finally块,然后有一个选项:

  • 如果finally块正常完成,那么try语句由于原因R而突然完成

  • 如果finally块因原因S而突然完成,则try语句因原因S而突然完成(,并且原因R被丢弃


因此,如果带有
finally
try
具有
return
并且
finally
也具有
return
,那么
finally
return
将取代
try
的try..catch..finally实际上被编译为嵌套的try..catch(您指定的例外情况)在try..catch(any)中,“finally”块由编译器剪切并粘贴到每个代码路径的“end”。(我在引号中加上“end”,因为我记不清它是如何处理“try”或“catch”块中的多个出口的。)您可以使用javap命令(dis-assembler)试验您的Java版本生成的字节码对应于不同的try..catch..finally组合。

try..catch..finally实际上被编译为try..catch(属于您指定的异常)中的嵌套try..catch(属于“any”),并且编译器将“finally”块剪切并粘贴到“end”每个代码路径的名称。(我在引号中加上“end”,因为我记不清它是如何处理“try”或“catch”块中的多个出口的。)你可以