以下三种情况都是可以的:
try-catch
try-finally
try-catch-finally
可以省略catch或者finally。catch和finally不可以同时省略。
答案:会。
(1)finally的作用就是,无论出现什么状况,finally里的代码一定会被执行。
(2)如果在catch中return了,也会在return之前,先执行finally代码块。
(3)而且如果finally代码块中含有return语句,会覆盖其他地方的return。
(4)对于基本数据类型的数据,在finally块中改变return的值对返回值没有影响,而对引用数据类型的数据会有影响。
注:
finally也不是一定会被执行。
(1)没有进入try代码块;
(2)System.exit()强制退出程序;
(3)守护线程被终止;
我们先通过几个代码实例来看一下~
(1) finally中的return覆盖try中的return,返回result=1。
public static int testTryCatch1() {
int result = 0;
try {
result = 1;
return result+1;
} catch (Exception e) {
return result;
} finally {
return result;
}
}//返回1
(2)在try找那个return之前,将基本数据类型的变量1存储在栈中,finally中对result改变,不会影响try中的返回值。
public static int testTryCatch2() {
int result = 0;
try {
result = 1;
return result;
} catch (Exception e) {
return result;
} finally {
result=2;
}
}
//返回1
(3)finally中的return覆盖catch中的return
public static int testTryCatch5() {
int result = 0;
try {
result = 1/0;
return result;
} catch (Exception e) {
return result;
} finally {
result=2;
return result;
}
}
//返回2
(4)finally中的return覆盖try中的return。
public static int testTryCatch5() {
int result = 0;
try {
result = 1/0;
return result;
} catch (Exception e) {
return result;
} finally {
result=2;
return result;
}
}
//返回2
(5)在执行catch中的return之前,把返回值0存储在栈中,所以finally中对于result的操作不影响返回值,所以返回0。
public static int testTryCatch6() {
int result = 0;
try {
result = 1/0;
return result;
} catch (Exception e) {
return result;
} finally {
result=2;
}
}
//返回0
以下四个方法,返回结果分别是AB、AB、AB、AB。
由此可见,对于引用数据类型,return之前,是将引用变量result存储在栈中,所以即使finally中对引用变量进行操作,也会影响返回值。
/**
* 引用数据类型try_finally中return的执行
* @return
*/
public static StringBuilder testTryCatch3() {
StringBuilder result = new StringBuilder("A");
try {
return result;
} catch (Exception e) {
return result;
} finally {
result.append("B");
return result;
}
}
public static StringBuilder testTryCatch4() {
StringBuilder result = new StringBuilder("A");
try {
return result;
} catch (Exception e) {
return result;
} finally {
result.append("B");
}
}
/**
* 引用数据类型catch_finally中return的执行
* @return
*/
public static StringBuilder testTryCatch7() {
StringBuilder result = new StringBuilder("A");
try {
int i=5/0;
return result;
} catch (Exception e) {
return result;
} finally {
result.append("B");
return result;
}
}
public static StringBuilder testTryCatch8() {
StringBuilder result = new StringBuilder("A");
try {
int i=5/0;
return result;
} catch (Exception e) {
return result;
} finally {
result.append("B");
}
}
(1)首先,finally中return肯定会覆盖try或者catch中的返回值。
(2)return之前必须会执行finally代码块,对于finally中没有return的语句来说:
如果返回值是基本数据类型,finally块中对返回值的改变不会影响返回值。因为在return之前已经将返回值的内容存储在栈中了。
如果返回值是引用数据类型,finally块中对返回值的改变会影响返回值。因为在return之前已经将引用对象的地址存储在栈中,finally块中对于引用对象值的改变会影响到返回值。