java try两个,在java中,如果两个try和catch都抛出相同的异常,最后有没有返回?...

public class Abc { public static void main(String args[]) { System.out.println

public class Abc {

public static void main(String args[]) {

System.out.println(Abc.method());

}

static int method() {

try {

throw new Exception();

}

catch(Exception e) {

throw new Exception();

}

finally {

return 4;

}

}

}

Why is the return value 4?

解决方案

That's the way finally works. The snippet

try {

throw new Exception();

} catch(Exception e) {

throw new Exception();

}

will complete abruptly, but the finally clause will kick in and when it returns it discards the original reason for completing the statement.

This is explained in section Blocks and Statements in the Java Language Specification. I've highlighted the relevant path in your situation:

A try statement with a

finally block is executed

by first executing the

try block. Then there is

a choice:

If

execution of the try

block completes normally, then the

finally block is

executed, and then there is a choice:

...

If execution

of the try block

completes abruptly because of a

throw of a value

V, then there is a choice:

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

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).

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 execution of the

try block completes

abruptly for any other reason

R, then the

finally block is

executed. Then there is a choice: ...