Java中的异常处理

use*_*808 0 java exception-handling

我有关于try,catch和Java的问题.请考虑以下情形:

try{
//Some code here that throws IOExceotion
} 
catch (IOException ex){
System.out.println("Line 1: IOException Encountered!");
throw ex;
}
finally {
System.out.println("Line 2: I am always executed!");
}
Run Code Online (Sandbox Code Playgroud)

上面的代码片段的输出是什么?我会看到:

Line 1: IOException Encountered!
Line 2: I am always executed!
Run Code Online (Sandbox Code Playgroud)

还是会的?

Line 2: I am always executed!
Line 1: IOException Encountered!
Run Code Online (Sandbox Code Playgroud)

或者它只是(因为我们在catch块中抛出)

Line 1: IOException Encountered!
Run Code Online (Sandbox Code Playgroud)

基本上,我没有找到一个示例,其中catch块中有一个"throw",最后阻塞catch块(如上例所示).任何人都可以对此有所了解吗?

谢谢.

mer*_*ike 5

引用Java语言规范,§14.20.4:

通过首先执行try块来执行具有finally块的try语句.然后有一个选择:

* If execution of the try block completes normally, then the finally block is executed, and then there is a choice:
      o If the finally block completes normally, then the try statement completes normally.
      o If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S. 
* If execution of the try block completes abruptly because of a throw of a value V, then there is a choice:
      o If the run-time type of V is assignable to the parameter of any catch clause of the try statement, then the first (leftmost) such catch clause is selected. The value V is assigned to the parameter of the selected catch clause, and the Block of that catch clause is executed. Then there is a choice:
            + If the catch block completes normally, then the finally block is executed. Then there is a choice:
                  # If the finally block completes normally, then the try statement completes normally.
                  # If the finally block completes abruptly for any reason, then the try statement completes abruptly for the same reason. 
            + If the catch block completes abruptly for reason R, then the finally block is executed. Then there is a choice:
                  # If the finally block completes normally, then the try statement completes abruptly for reason R.
                  # If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded). 
      o If the run-time type of V is not assignable to the parameter of any catch clause of the try statement, then the finally block is executed. Then there is a choice:
            + If the finally block completes normally, then the try statement completes abruptly because of a throw of the value V.
            + If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and the throw of value V is discarded and forgotten). 
* If execution of the try block completes abruptly for any other reason R, then the finally block is executed. Then there is a choice:
      o If the finally block completes normally, then the try statement completes abruptly for reason R.
      o If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded). 
Run Code Online (Sandbox Code Playgroud)