我知道如何尝试,捕获&终于工作了(在大多数情况下(,但我有一件事想知道:当我们在try(或catch(中已经有return时,try-catch之后的return语句会发生什么?
例如:
public boolean someMethod(){
boolean finished = false;
try{
// do something
return true;
}
catch(someException e){
// do something
}
finally{
// do something
}
return finished;
}
假设尝试中没有出现任何错误,那么我们返回了true。然后我们将进入最后一步,在那里我们可以做一些事情,比如关闭连接,然后呢?
在我们在finally中做了一些事情后,该方法会停止吗(因此该方法在try中返回true(,还是在finally之后该方法会再次继续,导致返回finished(这是false(?
提前感谢您的回复。
执行finally块的事实不会让程序忘记您返回的内容。如果一切顺利,finally块之后的代码将不会执行。
这里有一个例子说明了这一点:
public class Main {
public static void main(String[] args) {
System.out.println("Normal: " + testNormal());
System.out.println("Exception: " + testException());
}
public static int testNormal() {
try {
// no exception
return 0;
} catch (Exception e) {
System.out.println("[normal] Exception caught");
} finally {
System.out.println("[normal] Finally");
}
System.out.println("[normal] Rest of code");
return -1;
}
public static int testException() {
try {
throw new Exception();
} catch (Exception e) {
System.out.println("[except] Exception caught");
} finally {
System.out.println("[except] Finally");
}
System.out.println("[except] Rest of code");
return -1;
}
}
输出:
[normal] Finally
Normal: 0
[except] Exception caught
[except] Finally
[except] Rest of code
Exception: -1
如果一切顺利,则在执行finally
块之后执行try
内部的返回。
如果try
内部出现问题,则捕获并执行exception
,然后执行finally
块,然后执行之后的返回。
在这种情况下,finally中的代码会运行,但当没有异常时,会跳过另一个返回。你也可以通过记录一些东西来亲眼看到这一点:(
另请参阅有关System.exit
的内容:Java';s System.exit((是否使用try/catch/finaly块?
终于看到了回归:从Java 中的finally块返回
public int Demo1()
{
try{
System.out.println("TRY");
throw new Exception();
}catch(Exception e){
System.out.println("CATCH");
}finally{
System.out.println("FINALLY");
}return 0;
}
调用该方法的输出类似于
TRY
CATCH
FINALLY
0
意味着在这种特殊情况下,将Try{}catch{}finally{}
视为一个接一个执行的语句序列。然后控制权又回来了。
try中的代码肯定会执行。。但是当它到达return语句时。。它将移动到finally块,而不执行try块中的return语句。。然后finally的代码将被执行,然后try的返回语句将被执行。