java – 理解try catch最后返回它返回的值和值

前端之家收集整理的这篇文章主要介绍了java – 理解try catch最后返回它返回的值和值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下代码.
  1. public static void main(String[] args) {
  2. System.out.println(returnString());
  3. }
  4. private static String returnString(){
  5. try {
  6. System.out.println("Executing try");
  7. return "Return try value";
  8. } catch (Exception e){
  9. System.out.println("Executing Catch");
  10. return "Return catch value";
  11. } finally {
  12. System.out.println("Executing finally");
  13. return "Return finally value";
  14. }
  15. }

这个输出

  1. Executing try
  2. Executing finally
  3. Return finally value

如果我改变我的finally块而不返回任何类似的东西

  1. public static void main(String[] args) {
  2. System.out.println(returnString());
  3. }
  4. private static String returnString(){
  5. try {
  6. System.out.println("Executing try");
  7. return "Return try value";
  8. } catch (Exception e){
  9. System.out.println("Executing Catch");
  10. return "Return catch value";
  11. } finally {
  12. System.out.println("Executing finally");
  13. }
  14. }

然后输出

  1. Executing try
  2. Executing finally
  3. Return try value

现在我明白了,除非我们调用system.exit(0),否则最终总会被执行;调用或JVM崩溃.
我无法理解的是为什么返回值已经改变了?我仍然希望它返回try块的值.任何人都可以解释为什么最终值被考虑而不是try块的返回值?

请不要回答,因为即使在try块中有返回,最终也会执行…或者最后只有在有system.exit(0)时才执行;调用或JVM崩溃.据我所知.

编辑:(根据DirkDirk评论)

  1. public static void main(String[] args) {
  2. System.out.println(returnString());
  3. }
  4. private static String returnString(){
  5. try {
  6. System.out.println("Executing try");
  7. return printString("Return try value");
  8. } catch (Exception e){
  9. System.out.println("Executing Catch");
  10. return printString("Return catch value");
  11. } finally {
  12. System.out.println("Executing finally");
  13. return printString("Return finally value");
  14. }
  15. }
  16.  
  17. private static String printString(String str){
  18. System.out.println(str);
  19. return str;
  20. }

输出

  1. Executing try
  2. Return try value
  3. Executing finally
  4. Return finally value
  5. Return finally value

解决方法@H_403_31@
在从主块返回之前,JVM必须确保执行finally块,因此它就是这样做的.想法是执行finally块然后返回并从主块执行return语句.但是如果你在finally块中有一个return语句,那么它将在执行finally块时执行…这意味着控制永远不会返回到主块来完成return语句.

> JVM遇到主块中的return语句.它暂停主块的执行并检查finally子句.
>它完整地执行finally子句,包括其return语句.
>它永远不会完成try块.

但请注意,try块的返回表达式将被计算然后被丢弃.如果它有副作用,这很重要.因此,如果您的主要块已返回i,那么这将对返回值没有影响,但我仍然会增加. (感谢Dirk指出这一点.)

猜你在找的Java相关文章