Sta*_*wed 8 java return return-value try-catch-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");
return "Return finally value";
}
}
Run Code Online (Sandbox Code Playgroud)
这个输出是
Executing try
Executing finally
Return finally value
Run Code Online (Sandbox Code Playgroud)
如果我改变我的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");
}
}
Run Code Online (Sandbox Code Playgroud)
然后输出是
Executing try
Executing finally
Return try value
Run Code Online (Sandbox Code Playgroud)
现在我明白了,除非我们调用system.exit(0),否则最终总会被执行; 调用或JVM崩溃.我无法理解的是为什么返回值已经改变了?我仍然希望它返回try块的值.
任何人都可以解释为什么最终值被考虑而不是try块的返回值?
请不要回答,因为即使在try块中有返回也最终执行...或者最后只有在有system.exit(0)时才执行; 调用或JVM崩溃.据我所知.
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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Executing try
Return try value
Executing finally
Return finally value
Return finally value
Run Code Online (Sandbox Code Playgroud)
chi*_*ity 16
就在从主块返回之前,JVM必须确保finally块被执行,所以它就这样做了.想法是执行finally块然后返回并执行return主块中的语句.但是如果你return在finally块中有一个语句,那么它将在执行finally块时执行...这意味着控制永远不会返回到主块来完成return语句.
return主块中的语句.它暂停主块的执行并检查finally子句.finally条款,包括其return声明.try块.但请注意,try块的return表达式将被计算然后被丢弃.如果它有副作用,这很重要.因此,如果您的主要块有,return i++那么这将对返回值没有影响,但i仍然会增加.(感谢Dirk指出这一点.)
| 归档时间: |
|
| 查看次数: |
1978 次 |
| 最近记录: |