我正准备参加OCA Java考试并且错误地提出了这个问题。我不明白为什么return
语句无法访问。我的想法是,即使抛出异常,它也会被捕获,执行finally块中的语句然后执行return语句,或者如果抛出异常,线程是否不执行return语句?更一般地说,有人可以解释在触发异常的情况下发生的事情的规则,以及在finally块执行与否之后的情况。对于一些问题,我得到的是正确的,对于其他人我不是这样,我不清楚这里的确切编译规则。
public float parseFloat(String s){
float f = 0.0f;
try{
f = Float.valueOf(s).floatValue();
return f ;
}
catch(NumberFormatException nfe){
System.out.println("Invalid input " + s);
f = Float.NaN ;
return f;
}
finally { System.out.println("finally"); }
return f ;
}
答案 0 :(得分:3)
所以可能有一个理论上的情况,你的代码是有意义的:如果try {}块中的代码会抛出除NumberFormatException之外的任何其他异常。这是唯一可能的,如果它是未经检查的异常(您不需要捕获的异常)。编译器无法知道或检查这一点,因此除非您为其编写第二个catch块,否则不允许使用此类代码。 (如果你现在感到困惑:忘记我说的话,这对你的任务来说并不重要)
这是一个这样一个案例的样本:
public float parseFloat(String s){
float f = 0.0f;
try{
SomeOtherClass.doStuffWhichFailsWithRuntimeException();
return f;
}
catch(NumberFormatException nfe){
// will not run, because the thrown exception is not of type NumberFormatException
}catch(Exception e){
// any other failure besides NumberFormatException
// considered bad practice: If you do not know what fails, do not try to recover from it, it's most likely very bad.
return f;
}
finally {
// this will run after the catch block was run
System.out.println("finally");
}
// theoretically reachable, but compiler does not allow it because he cannot check it.
//return f ;
}
答案 1 :(得分:1)
如果发生异常,则捕获块运行,返回f,最后块运行。 最后一次
返回f;
永远不会到达。