异常处理中的流控制



我对Java相当陌生,无法理解try-catch-finally块中的控制流。每当在catch块中捕获异常时,无论是否将其放在finally块中,都将执行catch块后的代码。那么finally block有什么用呢?

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,无论发生什么都执行代码。

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

考虑一下:

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块可用于执行,即使在函数返回之后。

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

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

finally块中的代码总是执行,即使在trycatch中存在return或未处理的异常。这里解释了这一点,这是通过一个非常简单的谷歌搜索找到的。

相关内容

  • 没有找到相关文章

最新更新