詳解Java異常處置中throw與throws症結字的用法差別。本站提示廣大學習愛好者:(詳解Java異常處置中throw與throws症結字的用法差別)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java異常處置中throw與throws症結字的用法差別正文
拋出異常
拋出異常有三種情勢,一是throw,一個throws,還有一種體系主動拋異常。上面它們之間的異同。
體系主動拋異常
當法式語句湧現一些邏輯毛病、主義毛病或類型轉換毛病時,體系會主動拋出異常。如:
public static void main(String[] args) { int a = 5, b =0; System.out.println(5/b); //function(); }
體系會主動拋出ArithmeticException異常:
Exception in thread "main" java.lang.ArithmeticException: / by zero at test.ExceptionTest.main(ExceptionTest.java:62)
再如
public static void main(String[] args) { String s = "abc"; System.out.println(Double.parseDouble(s)); //function(); }
體系會主動拋出NumberFormatException異常:
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc" at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224) at java.lang.Double.parseDouble(Double.java:510) at test.ExceptionTest.main(ExceptionTest.java:62)
throw
throw是語句拋出一個異常。
語法:throw (異常對象);
如:
throw e;
普通會用於法式湧現某種邏輯時法式員自動拋出某種特定類型的異常。如:
public static void main(String[] args) { String s = "abc"; if(s.equals("abc")) { throw new NumberFormatException(); } else { System.out.println(s); } //function(); }
會拋出異常:
Exception in thread "main" java.lang.NumberFormatException at test.ExceptionTest.main(ExceptionTest.java:67)
throws
throws是辦法能夠拋出異常的聲明。(用在聲明辦法時,表現該辦法能夠要拋出異常)
語法:[(潤飾符)](前往值類型)(辦法名)([參數列表])[throws(異常類)]{......}
如:
public void function() throws Exception{......}
當某個辦法能夠會拋出某種異常時用於throws 聲明能夠拋出的異常,然後交給下層挪用它的辦法法式處置。如:
public static void function() throws NumberFormatException{ String s = "abc"; System.out.println(Double.parseDouble(s)); } public static void main(String[] args) { try { function(); } catch (NumberFormatException e) { System.err.println("非數據類型不克不及轉換。"); //e.printStackTrace(); } }
處置成果以下:
非數據類型不克不及轉換。
throw與throws的比擬
1、throws湧現在辦法函數頭;而throw湧現在函數體。
2、throws表現湧現異常的一種能夠性,其實不必定會產生這些異常;throw則是拋出了異常,履行throw則必定拋出了某種異常對象。
3、二者都是消極處置異常的方法(這裡的消極其實不是說這類方法欠好),只是拋出或許能夠拋出異常,然則不會由函數行止理異常,真實的處置異常由函數的下層挪用處置。
好的編程習氣:
1.在寫法式時,對能夠會湧現異常的部門平日要用try{...}catch{...}去捕獲它並對它停止處置;
2.用try{...}catch{...}捕獲了異常以後必定要對在catch{...}中對其停止處置,那怕是最簡略的一句輸入語句,或棧輸出e.printStackTrace();
3.假如是捕獲IO輸出輸入流中的異常,必定要在try{...}catch{...}後加finally{...}把輸出輸入流封閉;
4.假如在函數體內用throw拋出了某種異常,最好要在函數名中加throws拋異常聲明,然後交給挪用它的下層函數停止處置。
舉例:
throws E1,E2,E3只是告知法式這個辦法能夠會拋出這些異常,辦法的挪用者能夠要處置這些異常,而這些異常E1,E2,E3能夠是該函數體發生的。
throw則是明白了這個處所要拋出這個異常。
如:
void doA(int a) throws IOException,{ 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的話,那就是你把誰人偏向釀成真實的了。
假如是體系異常的話可以甚麼都不消做,也能夠針對辦法拋出一個異常,由於體系異常是可以被體系主動捕捉的,所以這個異常畢竟是要在辦法外部處理照樣交給下層函數去處理其實後果是一樣的。然則我查了許多材料,即便會拋出異常能被體系所捕捉的話照樣建議針對辦法寫一個throws,由於如許在完成一個年夜型義務的時刻可讓其余法式員曉得這裡會湧現甚麼異常。
假如是本身界說的異常,則必需要用throws拋出該辦法能夠拋出的異常,不然編譯會報錯。