最后一个语句应该是return
in和non void return types方法吗?但这仍然有效。
public String test()
{
try
{
// Do my work
return "myValue";
}
finally
{
System.out.println("I'm in Finally");
}
}
我有点缺乏了解这项工作的知识。有人可以解释一下吗。
答案 0 :(得分:5)
此代码没有问题,因为通过它的每条可能路径都不可避免地导致return
语句 * 。它不必是文本上的最后一个语句,只要它是逻辑上的最后一个语句(Java编译器足够聪明,可以弄清楚它是否如此,如果有代码中的路径没有返回,则会给出错误)价值或抛出异常)。在命中return
(即你的finally
块)之后会执行代码的事实不会改变任何东西:就编译器而言,你的函数在退出函数之前提供了一个返回值
* 事实上,您的函数代码只有一条路径,它终止于return
语句。
答案 1 :(得分:2)
在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";
}
答案 2 :(得分:1)
在这种情况下,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
}
}
在这种情况下,它会引发错误。因为,任何一个块都不会同时执行。与
相同public String fun(){
try{
return "here";
}
catch(Exception e){
//catch implementation without return
}
}
答案 3 :(得分:1)
关键的JLS概念是Normal and Abrupt Completion of Statements,并结合了try-finally的行为。
由于&#34; myValue&#34;的返回,try块突然完成。 finally块正常完成,因此整个try语句突然完成,原因与try块相同,返回&#34; myValue&#34;。
实际上,方法中的最后一个语句try语句是一个返回String的语句。