【发布时间】:2014-12-26 20:09:18
【问题描述】:
我有以下代码。
public static void main(String[] args) {
System.out.println(returnString());
}
private static String returnString(){
try {
System.out.println("Executing try");
return "Return try value";
} catch (Exception e){
System.out.println("Executing Catch");
return "Return catch value";
} finally {
System.out.println("Executing finally");
return "Return finally value";
}
}
这个的输出是
Executing try
Executing finally
Return finally value
如果我将 finally 块更改为不返回类似的东西
public static void main(String[] args) {
System.out.println(returnString());
}
private static String returnString(){
try {
System.out.println("Executing try");
return "Return try value";
} catch (Exception e){
System.out.println("Executing Catch");
return "Return catch value";
} finally {
System.out.println("Executing finally");
}
}
那么输出就是
Executing try
Executing finally
Return try value
现在我明白 finally 总是被执行,除非我们调用 system.exit(0);调用或JVM崩溃。
我无法理解的是为什么返回值发生了变化?我仍然希望它返回 try 块的值。
谁能解释为什么要考虑finally值而不是try块的返回值?
请不要回答,因为即使在 try 块中有 return 也会执行 finally ...或者 finally 仅在存在 system.exit(0) 时才执行;调用或JVM崩溃。据我所知。
编辑:
(根据Dirkthis 的评论)
public static void main(String[] args) {
System.out.println(returnString());
}
private static String returnString(){
try {
System.out.println("Executing try");
return printString("Return try value");
} catch (Exception e){
System.out.println("Executing Catch");
return printString("Return catch value");
} finally {
System.out.println("Executing finally");
return printString("Return finally value");
}
}
private static String printString(String str){
System.out.println(str);
return str;
}
输出:
Executing try
Return try value
Executing finally
Return finally value
Return finally value
【问题讨论】:
-
因为根据定义,finally 子句在您退出 try 块时都会执行。 System.exit(0) 看起来不像是编译器的出口,它不会抛出异常,因此 finally 无法获得控制权。同样,如果 JVM 崩溃,try 块内没有抛出异常。
标签: java return return-value try-catch-finally