最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java異常處理中throw與throws關(guān)鍵字的用法區(qū)別

 更新時間:2015年11月12日 14:59:22   作者:luoweifu  
這篇文章主要介紹了詳解Java異常處理中throw與throws關(guān)鍵字的用法區(qū)別,這也是Java面試題目中的???需要的朋友可以參考下

拋出異常
拋出異常有三種形式,一是throw,一個throws,還有一種系統(tǒng)自動拋異常。下面它們之間的異同。
系統(tǒng)自動拋異常
當(dāng)程序語句出現(xiàn)一些邏輯錯誤、主義錯誤或類型轉(zhuǎn)換錯誤時,系統(tǒng)會自動拋出異常。如:

public static void main(String[] args) { 
    int a = 5, b =0; 
    System.out.println(5/b); 
    //function(); 
} 

系統(tǒng)會自動拋出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(); 
} 

系統(tǒng)會自動拋出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;

一般會用于程序出現(xiàn)某種邏輯時程序員主動拋出某種特定類型的異常。如:

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是方法可能拋出異常的聲明。(用在聲明方法時,表示該方法可能要拋出異常)
語法:[(修飾符)](返回值類型)(方法名)([參數(shù)列表])[throws(異常類)]{......}
      如:     

 public void function() throws Exception{......}

當(dāng)某個方法可能會拋出某種異常時用于throws 聲明可能拋出的異常,然后交給上層調(diào)用它的方法程序處理。如:

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("非數(shù)據(jù)類型不能轉(zhuǎn)換。"); 
      //e.printStackTrace(); 
    } 
} 

處理結(jié)果如下:
非數(shù)據(jù)類型不能轉(zhuǎn)換。
throw與throws的比較
1、throws出現(xiàn)在方法函數(shù)頭;而throw出現(xiàn)在函數(shù)體。
2、throws表示出現(xiàn)異常的一種可能性,并不一定會發(fā)生這些異常;throw則是拋出了異常,執(zhí)行throw則一定拋出了某種異常對象。
3、兩者都是消極處理異常的方式(這里的消極并不是說這種方式不好),只是拋出或者可能拋出異常,但是不會由函數(shù)去處理異常,真正的處理異常由函數(shù)的上層調(diào)用處理。

好的編程習(xí)慣:
1.在寫程序時,對可能會出現(xiàn)異常的部分通常要用try{...}catch{...}去捕捉它并對它進(jìn)行處理;
2.用try{...}catch{...}捕捉了異常之后一定要對在catch{...}中對其進(jìn)行處理,那怕是最簡單的一句輸出語句,或棧輸入e.printStackTrace();
3.如果是捕捉IO輸入輸出流中的異常,一定要在try{...}catch{...}后加finally{...}把輸入輸出流關(guān)閉;
4.如果在函數(shù)體內(nèi)用throw拋出了某種異常,最好要在函數(shù)名中加throws拋異常聲明,然后交給調(diào)用它的上層函數(shù)進(jìn)行處理。


舉例:

throws E1,E2,E3只是告訴程序這個方法可能會拋出這些異常,方法的調(diào)用者可能要處理這些異常,而這些異常E1,E2,E3可能是該函數(shù)體產(chǎn)生的。
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("自定義異常");
}

代碼塊中可能會產(chǎn)生3個異常,(Exception1,Exception2,Exception3)。
如果產(chǎn)生Exception1異常,則捕獲之后再拋出,由該方法的調(diào)用者去處理。
如果產(chǎn)生Exception2異常,則該方法自己處理了(即System.out.println("出錯了!");)。所以該方法就不會再向外拋出Exception2異常了,void doA() throws Exception1,Exception3 里面的Exception2也就不用寫了。
而Exception3異常是該方法的某段邏輯出錯,程序員自己做了處理,在該段邏輯錯誤的情況下拋出異常Exception3,則該方法的調(diào)用者也要處理此異常。

throw語句用在方法體內(nèi),表示拋出異常,由方法體內(nèi)的語句處理。
throws語句用在方法聲明后面,表示再拋出異常,由該方法的調(diào)用者來處理。

throws主要是聲明這個方法會拋出這種類型的異常,使它的調(diào)用者知道要捕獲這個異常。
throw是具體向外拋異常的動作,所以它是拋出一個異常實(shí)例。

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

如果是系統(tǒng)異常的話可以什么都不用做,也可以針對方法拋出一個異常,因?yàn)橄到y(tǒng)異常是可以被系統(tǒng)自動捕獲的,所以這個異常究竟是要在方法內(nèi)部解決還是交給上層函數(shù)去解決其實(shí)效果是一樣的。但是我查了很多資料,即使會拋出異常能被系統(tǒng)所捕獲的話還是建議針對方法寫一個throws,因?yàn)檫@樣在完成一個大型任務(wù)的時候可以讓別的程序員知道這里會出現(xiàn)什么異常。

如果是自己定義的異常,則必須要用throws拋出該方法可能拋出的異常,否則編譯會報(bào)錯。

相關(guān)文章

  • idea中自動生成Java類圖和時序圖的圖文教程

    idea中自動生成Java類圖和時序圖的圖文教程

    本文主要介紹了idea中自動生成Java類圖和時序圖的圖文教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • JavaFX Metro UI 和 開發(fā)庫使用簡介

    JavaFX Metro UI 和 開發(fā)庫使用簡介

    這篇文章主要介紹了JavaFX Metro UI 和 開發(fā)庫解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • springboot整合阿里云百煉DeepSeek實(shí)現(xiàn)sse流式打印的操作方法

    springboot整合阿里云百煉DeepSeek實(shí)現(xiàn)sse流式打印的操作方法

    這篇文章主要介紹了springboot整合阿里云百煉DeepSeek實(shí)現(xiàn)sse流式打印,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2025-04-04
  • java之抽象類和繼承抽象類解讀

    java之抽象類和繼承抽象類解讀

    這篇文章主要介紹了java之抽象類和繼承抽象類,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Spring Boot 2.X快速整合jpa過程解析

    Spring Boot 2.X快速整合jpa過程解析

    這篇文章主要介紹了Spring Boot 2.X 如何快速整合jpa?,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Spring Boot Swagger2使用方法過程解析

    Spring Boot Swagger2使用方法過程解析

    這篇文章主要介紹了Spring Boot Swagger2使用方法過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • java實(shí)現(xiàn)幸運(yùn)抽獎系統(tǒng)

    java實(shí)現(xiàn)幸運(yùn)抽獎系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)幸運(yùn)抽獎系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Java中的自旋鎖解析

    Java中的自旋鎖解析

    這篇文章主要介紹了Java中的自旋鎖解析,自旋鎖是指當(dāng)一個線程嘗試獲取某個鎖時,如果該鎖已被其他線程占用,就一直循環(huán)檢測鎖是否被釋放,而不是進(jìn)入線程掛起或睡眠狀態(tài),需要的朋友可以參考下
    2023-10-10
  • vscode 配置java環(huán)境并調(diào)試運(yùn)行的詳細(xì)過程

    vscode 配置java環(huán)境并調(diào)試運(yùn)行的詳細(xì)過程

    這篇文章主要介紹了vscode 配置java環(huán)境并調(diào)試運(yùn)行的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • java實(shí)戰(zhàn)CPU占用過高問題的排查及解決

    java實(shí)戰(zhàn)CPU占用過高問題的排查及解決

    這篇文章給大家分享了java實(shí)戰(zhàn)CPU占用過高問題的排查及解決方法,有需要的朋友們可以學(xué)習(xí)下。
    2018-08-08

最新評論

任丘市| 河西区| 阳东县| 临夏县| 新民市| 庆安县| 岐山县| 台中县| 景宁| 临洮县| 水城县| 峨山| 聂荣县| 安仁县| 乐亭县| 新丰县| 游戏| 邹城市| 大埔区| 桐城市| 内丘县| 隆回县| 高雄县| 青海省| 绵阳市| 图木舒克市| 金塔县| 崇仁县| 贵港市| 澄迈县| 永州市| 车险| 民丰县| 嘉义市| 雅江县| 寻乌县| 洪泽县| 若尔盖县| 靖远县| 定州市| 德庆县|