java try catch finally-返回
尝试一个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
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”块中的多个出口的。)你可以