Java异常处理中的返回语句

8
如果执行没有引发异常,那么控制流程将进入 finally 代码块。那么,try 代码块中的 return 语句是否被 JVM 忽略了呢?即使出现异常,控制也会进入 catch 代码块,然后忽略返回语句,转而进入 finally 代码块并从其中返回。
  public class Helper {
     public int showException(int a, int b){

           try{
           int c=a/b;
           return c;
           } catch(Exception e){
                return 0;
           } finally{
               return 3;
             }
     }
  }

3
catch块中的'return'是不良的设计。 - Falaque
1
无论如何,finally 始终会被执行,如果不需要,可以尝试删除 finally。 - SpaceCowboy
1
如果成功的话,它就不会进入catch块。 - Falaque
只是试图弄清楚为什么这是糟糕的设计?如果您只在try块内返回条件,并且在该条件未满足但代码没有引发异常时在try-catch块外返回其他内容,那怎么办?并且如果捕获了异常,则返回不同的内容?(我知道您可以从那里重新抛出异常,但我想知道为什么这对您的代码不好) - Toon Casteele
我所询问的是,如果 try 块中没有异常,那么 try 块中的 return 语句是否会被执行?如果发生异常,则 catch 块中的 return 语句应该被执行,然后控制权才会到达 finally 块。这是否意味着 JVM 忽略了 try 或 catch 块中的 return 语句? - sonal
显示剩余6条评论
5个回答

4
由于finally块无论您是进入try还是catch,都会执行,我认为这就是它被称为finally的原因 :)。 来自JAVA DOCS

当try块退出时,finally块总是会执行。这确保了即使发生意外异常,finally块也会执行。

注意:只有以下情况下才不会执行

如果JVM在执行try或catch代码时退出,则finally块可能不会执行。同样,如果执行try或catch代码的线程被中断或终止,则finally块可能不会执行,尽管整个应用程序仍在运行。


我想问的是,如果try中没有异常,那么try中的return语句应该执行;如果发生异常,则应该执行catch中的return语句,然后控制流程进入finally。这是否意味着JVM会忽略try或catch块中的return语句? - sonal
@sonal:是的,它只会忽略try中的return,如果你在finally中定义了return - Parth Soni
@sonal:放置在 finally 块中的代码必须无论 try 块中发生什么都要执行。 - Parth Soni

2

按照设计,finally块中的返回语句始终优先执行。


0
无论 try catch 块是否执行,finally 块始终会被执行。

在try/catch块中,如果有return语句,JVM会从finally块返回吗? - sonal

0
finally块总是在try块退出时执行。这确保了即使发生意外异常,也会执行finally块。但finally不仅仅用于异常处理——它允许程序员避免清理代码被return、continue或break绕过的情况。将清理代码放在finally块中始终是一个好习惯,即使没有预期到任何异常情况。

阅读更多这里


-1

无论是否调用 catch 块,最后都会调用 Finally。也许您想阅读更多的文档。MSDN Try Catch Finally


这是关于Java,不是JavaScript。 - Tedil
当我点击链接时,它跳转到了JavaScript... - Mark Meyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接