【问题标题】:Flow control in Exception Handling [duplicate]异常处理中的流控制 [重复]
【发布时间】:2016-08-24 09:48:49
【问题描述】:

我对 Java 还很陌生,无法理解 try-catch-finally 块中的控制流程。每当在 catch 块中捕获到异常时,catch 块之后的代码也会被执行,无论我是否将它放在 finally 块中。那么finally块有什么用呢?

class Excp
{
 public static void main(String args[])
 {
  int a,b,c;
  try
  {
   a=0;
   b=10;
   c=b/a;
   System.out.println("This line will not be executed");
  }
  catch(ArithmeticException e)
  {
   System.out.println("Divided by zero"); 
  }
  System.out.println("After exception is handled");
 }
}

如果我将最后一个打印语句放在 finally 块中,没有区别。

【问题讨论】:

  • try 中抛出一个new RuntimeException(),你会注意到catch 块之后的代码没有被执行。然后添加一个 finally 块。
  • 您使用finally 块将您的程序设置为在发生任何异常后可以使用的状态。
  • finally 块中的代码总是 执行,即使在trycatch 中存在return 或未处理的异常。这是here 的解释,它是通过非常简单的谷歌搜索找到的。 请使用谷歌。

标签: java exception-handling try-catch-finally


【解决方案1】:

如果try/catch 块中发生另一个异常(您的代码未处理),则会有所不同。

没有finally,最后一行将不会被执行。使用finally,代码无论如何都会执行。

这对于执行垃圾收集器无法执行的清理任务特别有用:系统资源、数据库锁定、文件删除等......

【讨论】:

    【解决方案2】:

    考虑一下:

    try {
        a=0;
        b=10;
        c=b/a;
        System.out.println("This line will not be executed");
    }
    catch(ArithmeticException e){
        throw new RuntimeException("Stuff went wrong", e); 
    }
    System.out.println("This line will also not be executed");
    

    【讨论】:

      【解决方案3】:

      finally 块可以用来执行,即使在函数返回之后。

      例如

      public boolean doSmth() {
        try {
         return true;
        }
        finally {
          return false;
        }
      }
      

      会返回假;

      【讨论】:

        【解决方案4】:

        如果catch 块抛出异常,或者try 块抛出不同的异常,finally 块也将执行。

        例子:

        try {
          int a=5;
          int b=0;
          int c=a/b;
        catch (NullPointerException e) {
          // won't reach here
        } finally {
          // will reach here
        }
        

        你也可以完全省略 catch 块,仍然保证 finally 块将被执行:

        try {
          int a=5;
          int b=0;
          int c=a/b;
        } finally {
          // will reach here
        }
        

        【讨论】:

          【解决方案5】:

          finally 块中的代码总是 执行,即使在trycatch 中存在return 或未处理的异常。 here 对此进行了解释,这是通过非常简单的谷歌搜索找到的。 请使用谷歌。

          【讨论】:

            猜你喜欢
            • 2017-06-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-06
            相关资源
            最近更新 更多