一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - 詳解Java異常處理中throw與throws關(guān)鍵字的用法區(qū)別

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

2020-01-20 11:14luoweifu JAVA教程

這篇文章主要介紹了詳解Java異常處理中throw與throws關(guān)鍵字的用法區(qū)別,這也是Java面試題目中的常客,需要的朋友可以參考下

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

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

系統(tǒng)會(huì)自動(dòng)拋出ArithmeticException異常:

?
1
2
Exception in thread "main" java.lang.ArithmeticException: / by zero
at test.ExceptionTest.main(ExceptionTest.java:62)

  再如

?
1
2
3
4
5
public static void main(String[] args) {
    String s = "abc";
    System.out.println(Double.parseDouble(s));
    //function();
}

系統(tǒng)會(huì)自動(dòng)拋出NumberFormatException異常:

?
1
2
3
4
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是語(yǔ)句拋出一個(gè)異常。
語(yǔ)法:throw (異常對(duì)象);
      如: 

?
1
throw e;

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

?
1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
    String s = "abc";
    if(s.equals("abc")) {
      throw new NumberFormatException();
    } else {
      System.out.println(s);
    }
    //function();
}

會(huì)拋出異常:

?
1
2
Exception in thread "main" java.lang.NumberFormatException
at test.ExceptionTest.main(ExceptionTest.java:67)


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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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)異常的一種可能性,并不一定會(huì)發(fā)生這些異常;throw則是拋出了異常,執(zhí)行throw則一定拋出了某種異常對(duì)象。
3、兩者都是消極處理異常的方式(這里的消極并不是說這種方式不好),只是拋出或者可能拋出異常,但是不會(huì)由函數(shù)去處理異常,真正的處理異常由函數(shù)的上層調(diào)用處理。

好的編程習(xí)慣:
1.在寫程序時(shí),對(duì)可能會(huì)出現(xiàn)異常的部分通常要用try{...}catch{...}去捕捉它并對(duì)它進(jìn)行處理;
2.用try{...}catch{...}捕捉了異常之后一定要對(duì)在catch{...}中對(duì)其進(jìn)行處理,那怕是最簡(jiǎn)單的一句輸出語(yǔ)句,或棧輸入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只是告訴程序這個(gè)方法可能會(huì)拋出這些異常,方法的調(diào)用者可能要處理這些異常,而這些異常E1,E2,E3可能是該函數(shù)體產(chǎn)生的。
throw則是明確了這個(gè)地方要拋出這個(gè)異常。

如:

?
1
2
3
4
5
6
7
8
9
10
11
12
void doA(int a) throws IOException,{
      try{
         ......
 
      }catch(Exception1 e){
       throw e;
      }catch(Exception2 e){
       System.out.println("出錯(cuò)了!");
      }
      if(a!=b)
       throw new Exception3("自定義異常");
}

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

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

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

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产盗摄美女嘘嘘视频 | 久久se视频精品视频在线 | 久久理论片迅播影院一级 | 波多野结衣在线观看视频 | 亚洲精品成人AV在线观看爽翻 | 91制片厂制作传媒网站破解 | 精品精品国产自在现拍 | 国产东北三老头伦一肥婆 | 日本中文字幕不卡在线一区二区 | 日本黄色影院 | 97网站 | 国产精品不卡高清在线观看 | 温柔校草高h | 精品视频免费在线观看 | 无耻三级在线观看 | 免费国产一级观看完整版 | 国产亚洲精品激情一区二区三区 | 男女xxoo做爰猛烈动态一 | 精品一久久香蕉国产二月 | 车上小婕子系列辣文小说 | 视频一区国产精戏刘婷 | 办公室强行丝袜秘书啪啪 | 范冰冰好紧好滑好湿 | 人人艹在线视频 | 日本动漫打扑克动画片樱花动漫 | 色综合天天网 | 国产一级在线观看视频 | 午夜国产精品 | 欧美日韩亚洲另类人人澡 | 97大香伊在人人线色 | 亚洲国产区男人本色在线观看欧美 | 白丝爆动漫羞羞动漫网站 | 免费一级欧美大片在线观看 | 五月婷婷在线播放 | www.亚洲5555.com| 成人午夜视频一区二区国语 | 睡男神的这件小事小说在线阅读 | 青青热久久综合网伊人 | 高清国产精品久久久久 | 国产一级在线观看视频 | 干美女视频 |