throws簡介
throws總是出現在一個函式頭中,用來標明該成員函式可能拋出的各種異常。對大多數Exception子類來說,Java編譯器會強迫你聲明在一個成員函式中拋出的異常的類型。如果異常的類型是Error或RuntimeException,或它們的子類,這個規則不起作用,因為這在程式的 正常部分中是不期待出現的。如果你想明確地拋出一個RuntimeException,你必須用throws語句來聲明它的類型。
與throw對比
關鍵字:throwthrow是一種控制程式流程的特殊方法而已。沒有相應的catch的話,可以中止當前的方法繼續執行。
關鍵字:throws聲明方法時候,如果不聲明throws的話,那么一般的Exception都要在這個方法中終結,也就是說一定要有相應的catch處理,否則編譯時會產生錯誤。如果方法聲明了throws的話,可以交給上一級方法去處理。以此類推。但是有些Exception可以不加捕捉,編譯也會通過。繼承Exception類,可以自己定義Exception,對於特定的狀態,用throw拋出專用的例外。這對於特定的middleware開發,有一定幫助。
throws用於聲明,它並不是一個可以執行的語句。throws放在方法聲明的後面部分,用來說明這個方法可能會拋出什麼異常,
staticvoidthrowOne()throwsIllegalAccessException
這個聲明告訴調用者,方法throwOne可能會拋出IllegalAccessException異常。
格式是:方法聲明throws異常類1,異常類2,...
而throw則是一個動作,執行throw語句的時候會拋出一個異常。
關鍵字:try、catch用個形象的比喻,如果說throws相當於職業介紹中介的話,那try和catch就是一對倒霉的打工仔。很有意思,throws只是告訴編譯器--方法可能產生的異常問題,然後把問題處理拋給try和catch。他們一個負責發現異常關係,一個負責異常捕獲。很辛苦的一對難兄難弟喔,:)
程式實例
classThrowsDemo{
staticvoidthrowOne(){
System.out.println("InsidethrowOne.");
thrownewIllegalAccessException("demo");
}
publicstaticvoidmain(Stringargs[]){
throwOne();
}
}
為編譯該程式,需要改變兩個地方。第一,需要聲明throwOne()引發IllegalAccessException異常。第二,main()必須定義一個try/catch語句來捕獲該異常。
正確的例子如下:
classThrowsDemo{
staticvoidthrowOne()throwsIllegalAccessException{
System.out.println("InsidethrowOne.");
thrownewIllegalAccessException("demo");
}
publicstaticvoidmain(Stringargs[]){
try{
throwOne();
}catch(IllegalAccessExceptione){
System.out.println("Caught"+e);
}
}
}
下面是例題的輸出結果:
insidethrowOne
caughtjava.lang.IllegalAccessException:demo