根据这几个维度,有没有异常,有没有返回值
一.无返回值的情况
try {
a();
b();
} catch (Exception e) {
c();
} finally {
d();
}
e();
1.无异常
正常执行顺序
a()->b()->d()->e();
2.有异常
这里假设a();有异常,然后b()就不会走
a()->c()->d()->e();
二.有返回值
1.try中有返回值
public int method() {
try {
return 1;
} catch (Exception e) {
//处理异常
} finally {
// 这里是finally块中的代码
}
return 2;
}
- try块开始执行,计算并返回值1。
- 在try块内执行到
return 1
时,会先执行finally块中的所有代码 - finally块执行完毕后,方法将返回try块中指定的值1。
- 虽然在try-catch-finally结构之后还有一个
return 2
语句,但由于在try块中已经遇到了return语句并退出了方法,因此return 2;
不会被执行。
所以,该方法最终会返回值1。注意,无论finally块中有无return语句,在try或catch中一旦执行了return语句,finally块会先执行,然后方法会立即返回之前指定的值,不会再执行后续任何return语句。
2.catch中有返回值
public int method() {
try {
// ...
} catch (Exception e) {
return 1; // 如果有异常,这里会立即返回1
} finally {
// 这里的代码无论是否抛出异常都会被执行
}
return 2; // 如果没有异常,并且catch块没有return,则最终返回2
}
- 尝试执行
try
块中的代码。 - 如果
try
块中抛出了异常,程序会跳转到相应的catch
块,执行其中的代码并返回1。在Java中,无论try
块或catch
块内是否有异常抛出,并且无论是否执行了return
语句,finally
块中的代码都一定会被执行(除非在finally
块内部又抛出了未被捕获的异常或者调用了System.exit()
终止程序),当然是在执行catch中return之前,执行我们的finally代码块,同理我们的return2 就不执行啦. - 若
try
块中没有抛出异常,那么catch
块不会被执行,之后执行finally
块中的代码,最后执行return 2
。
因此,在上述代码示例中,方法最终返回的值只能是1或2,具体取决于try
块是否抛出异常。
3. try块和finally块中有return
public int method() {
try {
return 1; // try块中的return语句
} catch (Exception e) {
// catch块
} finally {
return 2; // finally块中的return语句
}
}
- 无异常:程序执行try块中return之前代码;再执行finally块,因为finally块中有return所以提前退出,而不再执行try中的return;
- 有异常:不执行try,顺序执行catch-finally
4 .catch块和finally块中有return
public int method() {
try{return 1;}
catch(){return 2;}
finally{return 3;}
}
无异常的情况:
- 如果
try
块中的代码正常执行且没有抛出异常,则程序将跳过catch
块直接进入finally
块执行。由于finally
块中有return 2
,所以最终方法会返回值2。
有异常的情况:
- 当
try
块中的代码抛出异常,并被捕获到catch
块中时,程序首先执行catch
块内的所有代码,包括return 1
前的任何表达式运算。然后,不论catch
块是否已执行了return
,都会继续执行finally
块。由于finally
块中含有return 2
,因此即使catch
块中已经有return
,最终的方法返回值仍然是finally
块中的返回值(即2)。
结论: 无论是无异常还是有异常的情况下,只要finally
块中存在return
语句,方法最终都将返回finally
块中的返回值(本例为2)。
今天先这样.