複製鏈接
請複製以下鏈接發送給好友

try

(java關鍵字)

鎖定
Java關鍵字
用於try..catch..finally塊,進行異常捕獲。
中文名
嘗試
外文名
try
應    用
用於捕獲異常
用    法
try是try..catch..finally塊中用來引導第一部分的關鍵字,用於聲明需要捕獲指定語句塊的異常

try完整的使用方法

try {
    語句塊1
} catch (<? extends Throwable> e) {
    語句塊2.1
} catch (<? extends Throwable> e) {
    語句塊2.2
} catch (<? extends Throwable> e) {
    語句塊2.3
...
} finally {
    語句塊3
}

catch可以出現0次、1次或多次,finally可以出現0次或1次,但是catch和finally不能同時不出現。

trycatch用法

當語句塊1中拋出異常時,立即離開語句塊1,之後會在所有catch中依次進行類名比對。如果拋出異常和catch聲明的異常類名一致,或拋出異常是catch聲明的異常的子類,則會進入該catch的語句塊(成為異常的捕獲),在catch的語句塊中可以將異常輸出到命令行或引導用户進行問題反饋。如果任何一個catch都不匹配,會向上層調用拋出這一異常(在此之前會進入finally語句塊,詳情參考下面的finally用法)。

tryfinally用法

在語句塊1、語句塊2中,任何試圖離開try..catch..finally塊的語句都會導致語句塊3被執行,如return throw break continue。在finally的語句塊中可以進行內存回收等工作。
需要注意的是,如果導致離開的不是語句造成的,而是斷電、內存不足等計算機故障,finally語句塊不會被執行。

try例子

public class Test {
    public static void main(String[] args) {
        int i = 10;
        try {
            System.out.println(i / 0);
        }  catch(ArithmeticException ame) {
            ame.printStackTrace();
        } finally {
            System.out.println("byebye");
        }
    }
}

try作用關係

try..catch..finally塊和return的作用關係不易於理解。
在這裏catch中的return語句和try中的return語句相似,因此只討論try..finally的情況
例1:
private int a = 0;
private static int c1() {
    try {
        return 1;
    } finally {
        a++;
    }
}

函數返回1,1次調用後a的值為1
這是因為在函數返回之前finally語句塊會被執行
例2:
private static int c2() {
    try {
        return 1; // unreachable statement
    } finally {
        return 2;
    }
}
函數返回2
這是因為在函數返回之前finally語句塊會被執行,因此return 2;會早於return 1;
Intellij IDEA等深度IDE中會提示unreachable statement
例3:
private int a = 0;
private static int c3() {
    try {
        return a + 10;
    } finally {
        a++;
    }
}
函數返回10,1次調用後a的值為1
jdk在進行編譯時,會這樣理解代碼:
1、將a + 10的值進行暫存,等待函數返回(該值為10)
2、執行a++(a的值變為1)
3、返回剛才暫存的值
相當於
int tmp = a + 10;
return tmp;
例4:
private int a = 0;
private static int change() {
    return ++a;
    private static int c4() {
    try {
        return change();
    } finally {
        return change();
    }
}
c4函數返回2,1次調用後a的值為2
jdk在進行編譯時,會這樣理解代碼:
1、(在try中)調用change並將其結果的值進行暫存,等待函數返回(該值為1)(a的值變為1)
2、(在finally中)調用change並返回(該值為2)(a的值變為2)(之前暫存的值失效,JVM會自動進行內存回收)
相當於
try {
    int tmp = change();
    return tmp; // unreachable statement
} finally {
    int t = change();
    return t;
}