2

我想知道为什么例如在以下代码段中:

try{
   //here happens a SQLException
}
catch(SQLException e){
   throw new InstantiationException();
}
finally{
   System.out.println("This is the finally");
}

这段代码的结果将首先打印出来"This is the finally",并且只有在它打印出来之后InstantiationException......

4

1 回答 1

3

来自Java 语言规范::

如果 try 块的执行由于抛出值 V 而突然完成,则有一个选择:(SQLException throw in try 子句

如果 V 的运行时类型是与 try 语句的任何 catch 子句的可捕获异常类兼容的赋值,则选择第一个(最左边)这样的 catch 子句。将值 V 分配给所选 catch 子句的参数,并执行该 catch 子句的 Block。然后有一个选择:

如果 catch 块正常完成,则执行 finally 块。然后有一个选择:

如果 finally 块正常完成,则 try 语句正常完成。

如果 finally 块因为任何原因突然完成,那么 try 语句也会因为同样的原因而突然完成。

如果 catch 块由于原因 R 突然完成,则执行 finally 块。然后有一个选择:(InstantiationException throw

如果 finally 块正常完成,则 try 语句会因为 R.( System.out.println("This is the finally") )而突然完成

我在每个执行步骤中都用粗体显示了文本。

总结:

  1. 在您的 try 块中引发 SQLException
  2. 控制转移到处理 SQLException 的 Catch 子句
  3. 当您抛出 InstantiationException 时,Catch 子句突然完成
  4. finally 块是通过打印你的文本来执行的
于 2013-03-02T22:51:11.940 回答