1. 程式人生 > >throw和throws用法

throw和throws用法

https://blog.csdn.net/wy5612087/article/details/47861077

1.java處理異常方式
在java程式碼中如果發生異常的話,jvm會丟擲異常物件,導致程式程式碼中斷,這個時候jvm在做的操作就是:建立異常物件,然後丟擲,比如:
int i= 1;
int j = 0;
int res = 0;
res = i/j;//除0錯誤
System.out.println(res);
這5句程式碼執行到第四句會中斷,因為jvm丟擲了異常
2.throw的作用
手動丟擲異常但是有時候有些錯誤在jvm看來不是錯誤,比如說
int age = 0;
age = -100;
System.out.println(age);
很正常的整形變數賦值,但是在我們眼中看來就不正常,誰的年齡會是負的呢。所以我們需要自己手動引發異常,這就是throw的作用
int age = 0;
age = -100;
if(age<0)
{
Exception e = new Exception();//建立異常物件
throw e;//丟擲異常
}
System.out.println(age);
3.throws的作用
宣告方法可能迴避的異常有異常被丟擲了,就要做處理,所以java中有try-catch可是有時候一個方法中產生了異常,但是不知道該怎麼處理它,那麼就放著不管,當有異常丟擲時會中斷該方法,而異常被拋到這個方法的呼叫者那裡。這個有點像下屬處理不了的問題就交到上司手裡一樣,這種情況稱為迴避異常但是這使得呼叫這個方法就有了危險,因為誰也不知道這個方法什麼時候會丟一個什麼樣的異常給呼叫者,所以在定義方法時,就需要在方法頭部分使用throws來宣告這個方法可能迴避的異常
void fun()throws IOException,SQLException
{
...
}
這表示 fun方法可能會丟兩個異常出來,那麼在呼叫fun的時候就會做好準備,比如可以這樣
try
{
fun();
}catch(IOException e)
{
}catch(SQLException e)
{
}
4.方法原理
系統自動丟擲的異常 所有系統定義的編譯和執行異常都可以由系統自動丟擲,稱為標準異常,並且 Java 強烈地要求應用程式進行完整的異常處理,給使用者友好的提示,或者修正後使程式繼續執行。

語句丟擲的異常  使用者程式自定義的異常和應用程式特定的異常,必須藉助於 throws 和 throw 語句來定義丟擲異常。

throw是語句丟擲一個異常。 語法:throw (異常物件);          throw e;

throws是方法可能丟擲異常的宣告。(用在宣告方法時,表示該方法可能要丟擲異常) 語法:[(修飾符)](返回值型別)(方法名)([引數列表])[throws(異常類)]{......}             public void doA(int a) throws Exception1,Exception3{......}

5.舉例:
throws E1,E2,E3只是告訴程式這個方法可能會丟擲這些異常,方法的呼叫者可能要處理這些異常,而這些異常E1,E2,E3可能是該函式體產生的。 throw則是明確了這個地方要丟擲這個異常。

void doA(int a) throws Exception1,Exception3{
           try{
                 ......
           }catch(Exception1 e){
              throw e;
           }catch(Exception2 e){
              System.out.println("出錯了!");
           }
           if(a!=b)
              throw new  Exception3("自定義異常");
}
程式碼塊中可能會產生3個異常,(Exception1,Exception2,Exception3)。如果產生Exception1異常,則捕獲之後再丟擲,由該方法的呼叫者去處理。如果產生Exception2異常,則該方法自己處理了(即System.out.println("出錯了!");)。所以該方法就不會再向外丟擲Exception2異常了,void doA() throws Exception1,Exception3 裡面的Exception2也就不用寫了。而Exception3異常是該方法的某段邏輯出錯,程式設計師自己做了處理,在該段邏輯錯誤的情況下丟擲異常Exception3,則該方法的呼叫者也要處理此異常。

throw語句用在方法體內,表示丟擲異常,由方法體內的語句處理。throws語句用在方法聲明後面,表示再丟擲異常,由該方法的呼叫者來處理。

throws主要是宣告這個方法會丟擲這種型別的異常,使它的呼叫者知道要捕獲這個異常。throw是具體向外拋異常的動作,所以它是丟擲一個異常例項。

throws說明你有那個可能,傾向。throw的話,那就是你把那個傾向變成真實的了。

6.總結
1、throws出現在方法函式頭;而throw出現在函式體。
2、throws表示出現異常的一種可能性,並不一定會發生這些異常;throw則是丟擲了異常,執行throw則一定丟擲了某種異常。
3、兩者都是消極處理異常的方式(這裡的消極並不是說這種方式不好),只是丟擲或者可能丟擲異常,但是不會由函式去處理異常,真正的處理異常由函式的上層呼叫處理。