异常处理中的流程控制

Flow control in Exception Handling

我是 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");
 }
}

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

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

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

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

如果 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
}

考虑一下:

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");

finally 块中的代码 总是 执行,即使在 trycatch 中有一个 return 或一个未处理的例外。 here 对此进行了解释,这是通过非常简单的 google 搜索找到的。 请使用google.

finally 块可用于执行,即使在函数 returns 之后。

例如

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

会 return 错误;