最后一条语句应该return
在非 void 返回类型方法中吗?但这仍然有效。
public String test()
{
try
{
// Do my work
return "myValue";
}
finally
{
System.out.println("I'm in Finally");
}
}
我有点缺乏了解这是如何工作的知识。谁能给我解释一下。
这段代码没有问题,因为通过它的每一条可能的路径都不可避免地导致return
声明*。它不必是文本上的最后一个语句,只要它是逻辑上的最后一个语句(Java 编译器足够聪明,可以判断它是否是这样,如果代码中的路径不返回值或抛出异常)。return
在点击(即你的块)之后会有代码执行的事实finally
并没有改变任何东西:就编译器而言,你的函数在退出函数之前提供了一个返回值。
*事实上,你的函数代码只有一条路径,它在return
语句处终止。
在 Java 中,确保所有可能的代码路径要么返回值要么抛出异常就足够了。例如,以下代码是有效的:
public boolean test() {
if (3 < 5) {
return true;
} else {
throw new RuntimeException("Holy crap!");
}
}
在您的示例中,您的try
块以返回结束,因此涵盖了快乐的路径,并且不需要超出finally
;的代码。此外,任何抛出的异常都try
将传播到方法之外并且没有机会到达方法的末尾,因此所有可能的路径都不会到达finally
块下的部分,并且不需要返回语句。(事实上,如果你return
在底部添加了一条语句,编译器可能会给你一个关于无法访问代码的警告或错误!)
添加catch
子句时情况会发生变化,因为现在代码有可能超出try
//块catch
:finally
public String test(){
try{
// Do my work
return "myValue";
}
catch (Exception ex) {
System.out.println("O noes something went wrong");
// swallow exception
}
finally {
System.out.println("I'm in Finally");
}
// Oh no! If an exception was caught, code can actually flow through here.
// Compiler will complain about a missing return statement until you add one.
// return "someOtherValue";
}
在这种情况下try
并finally
始终执行。所以,在哪里并不重要return
。
public String myfun(){
return "here";
}
or
public String myfun(){
try{
return "here";
}finally{
//will execute always
}
}
几乎一样。什么时候,你会看到程序的流程。但是,如果有任何条件,比如
public String myfun(){
if(x==1){
return "here";
}
else{
// something here
}
}
在这种情况下,它会引发 error。因为,任何一个块都不会同时执行。如同
public String fun(){
try{
return "here";
}
catch(Exception e){
//catch implementation without return
}
}
JLS 的关键概念是Normal 和 Abrupt Completion of Statements,以及try-finally的行为。
由于“myValue”的返回,try 块突然完成。finally 块正常完成,因此整个 try 语句由于与 try 块相同的原因而突然完成,返回“myValue”。
实际上,方法中的最后一个语句 try 语句是返回字符串的语句。