Try{}catch(){}finally{}语句中含有return语句如何执行
这里分多种情况:
- 情况1:
try{}中含有return,并且try{}中没有异常,且finally{}中没有return。
public String exceptionTest(){
System.out.println("程序开始执行啦");
try{
int[] arrays = {1,2};
return "try执行完毕"; //实现约定好的返回值
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("数组越界异常");
}catch(NullPointerException e){
System.out.println("空指针异常");
}finally {
System.out.println("执行了finally块");
}
return "执行到了最后";
}
执行结果:
总结1:
如果在try中就含有return且含有finally块,程序先将try中return的结果保留,执行完finally块,最后返回try中return的值
- 情况2:
try{}中含有return,并且try{}中有异常,且finally{}中没有return。
public String exceptionTest(){
System.out.println("程序开始执行啦");
try{
int[] arrays = {1,2};
System.out.println(arrays[10]); //制造一个数组越界异常
return "try执行完毕"; //实现约定好的返回值
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("数组越界异常");
}catch(NullPointerException e){
System.out.println("空指针异常");
}finally {
System.out.println("执行了finally块");
}
return "执行到了最后";
}
执行结果:
总结2:
如果try语句中的最后含有return语句且前面有异常,程序会执行异常中catch语句,然后到finally块,不会往下执行try语句,所以最终执行的return是整个方法最后的return
- 情况3:
try{}中含有return,并且try{}中没异常,且finally{}中有return。
public String exceptionTest(){
System.out.println("程序开始执行啦");
try{
int[] arrays = {1,2};
return "try执行完毕"; //实现约定好的返回值
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("数组越界异常");
}catch(NullPointerException e){
System.out.println("空指针异常");
}finally {
System.out.println("执行了finally块");
return "执行了finally中的return";
}
}
执行结果:
总结3:
finally中的语句一定会执行,finally中有return就执行finally中的
- 情况4:
return中返回值类型是基本数据类型,且finally{}中改变了变量的值。
public int exceptionTest(){
System.out.println("程序开始执行啦");
int i = 10;
try{
int[] arrays = {1,2};
return i; //实现约定好的返回值
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("数组越界异常");
}catch(NullPointerException e){
System.out.println("空指针异常");
}finally {
i += 10;
System.out.println("执行了finally块");
}
return i;
}
执行结果:
总结4
尽管finally块中改变了返回值 i,但因为finally中没有return该i的值,因此在执行完finally中的语句后返回的还是原来 i=10 的值,如果return在finally里面则返回 i = 20
- 情况5:
return中返回值类型是引用数据类型,且finally{}中改变了改引用数据类型的值。
public class ExceptionTest {
public int[] exceptionTest(){
System.out.println("程序开始执行啦");
int[] arrays = {1,2};
try{
return arrays; //实现约定好的返回值
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("数组越界异常");
}catch(NullPointerException e){
System.out.println("空指针异常");
}finally {
arrays[0] = 10;
System.out.println("执行了finally块");
}
return arrays;
}
public static void main(String[] args){
ExceptionTest test = new ExceptionTest();
int[] array = test.exceptionTest(); //接收返回值
//循环遍历返回值数组
for (int num : array) {
System.out.println(num);
}
}
}
执行结果:
总结5
因为finally中改变的是引用数据类型,所以整个类型里的值都会改变。这里的区别就是和形参实参的区别一样,我们用变量接收基本数据类型接收的是值,当方法结束,一切都烟消云散,归于原来的样子;但当变量接收的是引用数据类型的时候,存的是引用地址,我们对他操作就相当于通过地址找到了他本身,对本体操作,方法结束时,但样子已经不是原来的样子了。
注意:总之finally里含有return会把之前的return覆盖掉