【发布时间】:2014-08-02 20:46:04
【问题描述】:
我正在准备 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 ;
}
【问题讨论】:
-
因为
try/catch块中的return f;语句之一将运行。 -
@August 这里的Java编译器分析引擎没有考虑到——在try中也可能抛出不同异常(确保没有返回值) ,这样就不会运行任何返回。即把
Float.valueOf(s).floatValue()替换成float f(),其中的内容并不重要——分析不会改变。 -
java-samples.com/showtutorial.php?tutorialid=296 。如果没有异常,最终发生(就在第一个 return f; 之前)一旦完成它就会返回(然后不要调用 last return f)。如果有 NumberFormatException,同样适用,最后一种可能性是一个不是 NumberFormatException 的异常,在这种情况下,异常没有被捕获,然后它被传递给父级,但最终会发生,在 finally 结束时将传递异常。然后永远不会达到最后一个 return f 。 finally 总是被调用,并让最后一个动作在 finally 结束时等待以完成它。
标签: java