大家都知道在try…catch…finally語句塊中,finally是肯定必然執行的;catch語句塊是在出現異常時纔會執行的;
猜測一下,下面的代碼返回值是多少?是10? 11? 12? 13?
public static int print() {
int a = 10;
try {
a = 11;
return a;
}catch (Exception e) {
a = 12;
}finally {
a = 13;
}
}
返回值爲11;這是大家都知道的;但是通過調試代碼可知,a的最終值爲13
調試:
public static int print() {
int a = 10;
try {
a = 11;
return a;
}catch (Exception e) {
a = 12;
return a;
}finally {
a = 13;
}
}
返回值爲11;通過調試,a的最終值爲13
public static int print() {
int a=10;
try{
a=11;
return a;
}catch(Exception e){
a = 12;
}finally {
a=13;
return a;
}
}
返回值爲13;通過調試,a的最終值爲13
public static int print2() {
int a = 10;
try {
a = 11;
}catch (Exception e) {
a = 12;
return a;
}finally {
a = 13;
return a;
}
}
返回值爲13;通過調試,a的最終值爲13
public static int print2() {
int a = 10;
try {
a = 11;
return a;
}catch (Exception e) {
a = 12;
return a;
}finally {
a = 13;
return a;
}
}
返回值爲13;通過調試,a的最終值爲13
有沒有發現,在finally語句塊中如果有return語句,則就會返回finally語句塊中的內容;
如果finally語句塊中沒有return語句,則就會返回try語句塊中的內容,即使catch語句塊中有返回值也起不到作用,因爲catch語句塊只有在出現異常時纔會執行;
其實:
(1)異常體系中,若finally代碼塊中存在return語句,則try、catch語句失效。
(2)若finally無return,try有return語句,則try代碼塊先暫存代碼塊中的值,然後在代碼塊中還是該進行怎樣的操作就進行怎樣的操作,變量的值該怎麼變化就怎麼變化,最後執行finally代碼塊,只不過最終返回的是try語句塊中的暫存值。
對於基本類型是這樣,對於對象也是這樣:
class Person{
public int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Test {
public static Person test() {
Person person = new Person();
try {
person.age = 1;
return person;
}catch (Exception e) {
person.age = 2;
return person;
}finally {
person = new Person();
person.age = 3;
return person;//finally語句塊中有return語句
}
}
public static void main(String[] args) {
System.out.println(test().age);
}
}
運行結果爲:
而:
class Person{
public int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Test {
public static Person test() {
Person person = new Person();
try {
person.age = 1;
return person;
}catch (Exception e) {
person.age = 2;
return person;
}finally {
person = new Person();
person.age = 3;
//finally語句塊中無return語句
}
}
public static void main(String[] args) {
System.out.println(test().age);
}
}
返回值爲: