再探Java根底——throw與throws。本站提示廣大學習愛好者:(再探Java根底——throw與throws)文章只能為提供參考,不一定能成為您想要的結果。以下是再探Java根底——throw與throws正文
轉載:http://blog.csdn.net/luoweifu/article/details/10721543 我停止了一些加工,不是自己原創但比原博次要更完善~
淺談Java異常
以前雖然知道一些異常的處置,也用過一些,但是對throw和throws區別還是有不太清楚。明天用實例測試一下
異常處置機制
異常處置是對能夠呈現的異常停止處置,以避免順序遇到異常時被卡死,處於不斷等候,或死循環
異常有兩個進程,一個是拋出異常;一個是捕獲異常
拋出異常拋出異常有三種方式,一是throw,一個throws,還有一種零碎自動拋異常。上面它們之間的異同
零碎自動拋異常當順序語句呈現一些邏輯錯誤、主義錯誤或類型轉換錯誤時,零碎會自動拋出異常。如:
1 public static void main(String[] args) { 2 int a = 5, b =0; 3 System.out.println(5/b); 4 //function(); 5 }零碎會自動拋出ArithmeticException異常:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at test.ExceptionTest.main(ExceptionTest.java:62)
再如:1 public static void main(String[] args) { 2 String s = "abc"; 3 System.out.println(Double.parseDouble(s)); 4 //function(); 5 }零碎會自動拋出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 e;
普通會用於順序呈現某種邏輯時順序員自動拋出某種特定類型的異常。如:
1 public static void main(String[] args) { 2 String s = "abc"; 3 if(s.equals("abc")) { 4 throw new NumberFormatException(); 5 } else { 6 System.out.println(s); 7 } 8 //function(); 9 }
會拋出異常:
Exception in thread "main" java.lang.NumberFormatException
at test.ExceptionTest.main(ExceptionTest.java:67)
throws是辦法能夠拋出異常的聲明。(用在聲明辦法時,表示該辦法能夠要拋出異常,允許聲明拋出多個異常,用逗號隔開)
語法:[(修飾符)](前往值類型)(辦法名)([參數列表])[throws(異常類)]{......}
如:public void function() throws Exception{......}
當某個辦法能夠會拋出某種異常時用於throws 聲明能夠拋出的異常,然後交給下層調用它的辦法順序處置。如:
1 public static void function() throws NumberFormatException{ 2 String s = "abc"; 3 System.out.println(Double.parseDouble(s)); 4 } 5 6 public static void main(String[] args) { 7 try { 8 function(); 9 } catch (NumberFormatException e) { 10 System.err.println("非數據類型不能轉換。"); 11 //e.printStackTrace(); 12 } 13 }
處置後果如下:
非數據類型不能轉換。
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拋異常聲明,然後交給調用它的下層函數停止處置
先講捕獲異常
1 try{ 2 …… 3 }catch(Exception e){ 4 …… 5 }finally{ 6 …… 7 }
try{……}中放置能夠會發作異常的的語句塊,如能夠呈現異常的函數,也可以是普通的順序語句;catch(){……}用於抓住異常,(Exception e)中Exception是異常的類型,必需是Exception(Exception是一切異常類的父類)的子類。{}定義當呈現異常時的處置辦法。finally{……}表示不論異常能否發作,都得停止finally{}中的處置
在捕獲異常的try{...}語句塊中,假如呈現了異常,則該語句(呈現異常的語句)後的順序語句都不執行,而是跳到catch{...}語句塊中執行異常的處置。如:
1 public static void function1() throws NumberFormatException{ 2 System.out.println(Double.parseDouble("abc")); 3 System.out.println("第二條語句。"); 4 5 } 6 7 public static void main(String[] args) { 8 try { 9 function1(); 10 } catch (Exception e) { 11 System.err.println(e.getMessage()); 12 //e.printStackTrace(); 13 } 14 }
後果如下,只輸入了一條錯誤提示語:
For input string: "abc"
System.out.println("第二條語句。");未執行。
假如一個函數沒有用throws停止拋異常,在調用該函數的辦法也異樣可以捕獲異常。如:
1 public static void function() { 2 String s = "abc"; 3 System.out.println(Double.parseDouble(s)); 4 } 5 6 public static void main(String[] args) { 7 try { 8 function(); 9 } catch (Exception e) { 10 System.err.println("非數據類型不能轉換。"); 11 //e.printStackTrace(); 12 } 13 }
處置後果如下:
非數據類型不能轉換。
闡明:某個函數或某段順序塊不論會不會,有沒能夠拋出異常,都可以加try{...}catch{...}去捕獲它
用戶可以自定義異常,新建一個異常類,讓其承繼Exception類或Exception的某個子類。然後用throw拋出自己定義的異常類對象。
在停止順序開發的進程中,自定義異常遵照以下四個步驟:
1)首先創立自定義異常類,語法格式:自定義異常類名 extends Exception。
2)在辦法中經過關鍵字throw拋出異常對象。
3)若是在以後拋出異常的辦法中處置異常,可以用try-catch語句捕捉並處置;若不是,在辦法的聲明處經過關鍵字throws指明要拋出給辦法調用的異常。
4)在呈現異常辦法的調用中捕捉並處置異常
如:
1 package packageone; 2 3 //自定義異常類 4 class MyException extends Exception{ 5 public MyException(String s){ 6 super(s); 7 } 8 } 9 10 /* 11 * 設計類Number,類中有除法計算辦法。運用自定義異常類 12 */ 13 class Number{ 14 public int divition(int num1,int num2) throws MyException { 15 if (0==num2) { 16 throw new MyException("分母不能為零!"); 17 } 18 return (num1/num2); 19 } 20 } 21 //測試自定義異常類 22 public class ExceptionTest{ 23 public static void main(String[] args) { 24 Number n = new Number(); 25 try { 26 System.out.println("自定義兩個數的商的後果為:"+n.divition(12, 0)); 27 } catch (MyException e) { 28 System.out.println(e.getMessage()); 29 e.printStackTrace(); 30 } 31 } 32 }
處置後果如下: 分母不能為零!
packageone.MyException: 分母不能為零!
at packageone.Number.divition(ExceptionTest.java:16)
at packageone.ExceptionTest.main(ExceptionTest.java:26)