亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java進階教程之異常處理

2019-11-26 15:26:19
字體:
來源:轉載
供稿:網友

程序很難做到完美,不免有各種各樣的異常。比如程序本身有bug,比如程序打印時打印機沒有紙了,比如內存不足。為了解決這些異常,我們需要知道異常發生的原因。對于一些常見的異常,我們還可以提供一定的應對預案。C語言中的異常處理是簡單的通過函數返回值來實現的,但返回值代表的含義往往是由慣例決定的。程序員需要查詢大量的資料,才可能找到一個模糊的原因。面向對象語言,比如C++, Java, Python往往有更加復雜的異常處理機制。這里討論Java中的異常處理機制。

Java異常處理

異常處理

Java的異常處理機制很大一部分來自C++。它允許程序員跳過暫時無法處理的問題,以繼續后續的開發,或者讓程序根據異常做出更加聰明的處理。

Java使用一些特殊的對象來代表異常狀況,這樣對象稱為異常對象。當異常狀況發生時,Java會根據預先的設定,拋出(throw)代表當前狀況的對象。所謂的拋出是一種特殊的返回方式。該線程會暫停,逐層退出方法調用,直到遇到異常處理器(Exception Handler)。異常處理器可以捕捉(catch)的異常對象,并根據對象來決定下一步的行動,比如:

提醒用戶
處理異常
繼續程序
退出程序
......

異常處理器看起來如下,它由try, catch, finally以及隨后的程序塊組成。finally不是必須的。

try { ...;}catch() { ...;}catch() { ...;}finally { ...;}

這個異常處理器監視try后面的程序塊。catch的括號有一個參數,代表所要捕捉的異常的類型。catch會捕捉相應的類型及其衍生類。try后面的程序塊包含了針對該異常類型所要進行的操作。try所監視的程序塊可能拋出不止一種類型的異常,所以一個異常處理器可以有多個catch模塊。finally后面的程序塊是無論是否發生異常,都要執行的程序。

我們在try中放入可能出錯,需要監視的程序,在catch中設計應對異常的方案。

 下面是一段使用到異常處理的部分Java程序。try部分的程序是從一個文件中讀取文本行。在讀取文件的過程中,可能會有IOException發生:

BufferedReader br = new BufferedReader(new FileReader("file.txt"));try {  StringBuilder sb = new StringBuilder();  String line = br.readLine();  while (line != null) {    sb.append(line);    sb.append("/n");    line = br.readLine();  }  String everything = sb.toString();} catch(IOException e) {  e.printStackTrace();  System.out.println("IO problem");}finally {  br.close();}

如果我們捕捉到IOException類對象e的時,可以對該對象操作。比如調用對象的printStackTrace(),打印當前棧的狀況。此外,我們還向中端打印了提示"IO problem"。

無論是否有異常,程序最終會進入finally塊中。我們在finally塊中關閉文件,清空文件描述符所占據的資源。

 異常的類型

Java中的異常類都繼承自Trowable類。一個Throwable類的對象都可以拋出(throw)。

 

橙色: unchecked; 藍色: checked

Throwable對象可以分為兩組。一組是unchecked異常,異常處理機制往往不用于這組異常,包括:

1.Error類通常是指Java的內部錯誤以及如資源耗盡的錯誤。當Error(及其衍生類)發生時,我們不能在編程層面上解決Error,所以應該直接退出程序。

2.Exception類有特殊的一個衍生類RuntimeException。RuntimeException(及其衍生類)是Java程序自身造成的,也就是說,由于程序員在編程時犯錯。RuntimeException完全可以通過修正Java程序避免。比如將一個類型的對象轉換成沒有繼承關系的另一個類型,即ClassCastException。這類異常應該并且可以避免。

剩下的是checked異常。這些類是由編程與環境互動造成程序在運行時出錯。比如讀取文件時,由于文件本身有錯誤,發生IOException。再比如網絡服務器臨時更改URL指向,造成MalformedURLException。文件系統和網絡服務器是在Java環境之外的,并不是程序員所能控制的。如果程序員可以預期異常,可以利用異常處理機制來制定應對預案。比如文件出問題時,提醒系統管理員。再比如在網絡服務器出現問題時,提醒用戶,并等待網絡服務器恢復。異常處理機制主要是用于處理這樣的異常。

拋出異常

在上面的程序中,異常來自于我們對Java IO API的調用。我們也可以在自己的程序中拋出異常,比如下面的battery類,有充電和使用方法:

 

public class Test{  public static void main(String[] args)  {    Battery aBattery = new Battery();    aBattery.chargeBattery(0.5);    aBattery.useBattery(-0.5);  }}class Battery {  /**   * increase battery   */  public void chargeBattery(double p)  {    // power <= 1    if (this.power + p < 1.) {      this.power = this.power + p;    }    else {      this.power = 1.;    }  }  /**   * consume battery   */  public boolean useBattery(double p)  {    try {      test(p);    }    catch(Exception e) {      System.out.println("catch Exception");      System.out.println(e.getMessage());      p = 0.0;    }    if (this.power >= p) {      this.power = this.power - p;      return true;    }    else {      this.power = 0.0;      return false;    }  }  /**   * test usage   */  private void test(double p) throws Exception // I just throw, don't handle  {    if (p < 0) {      Exception e = new Exception("p must be positive");      throw e;    }  }  private double power = 0.0; // percentage of battery}

useBattery()表示使用電池操作。useBattery()方法中有一個參數,表示使用的電量。我們使用test()方法測試該參數。如果該參數為負數,那么我們認為有異常,并拋出。

在test中,當有異常發生時(p < 0),我們創建一個Exception對象e,并用一個字符串作為參數。字符串中包含有異常相關的信息,該參數不是必需的。使用throw將該Exception對象拋出。

我們在useBattery()中有異常處理器。由于test()方法不直接處理它產生的異常,而是將該異常拋給上層的useBattery(),所以在test()的定義中,我們需要throws Exception來說明。

(假設異常處理器并不是位于useBattery()中,而是在更上層的main()方法中,我們也要在useBattery()的定義中增加throws Exception。)

 在catch中,我們使用getMessage()方法提取其異常中包含的信息。上述程序的運行結果如下:

catch Exceptionp must be positive

異常處理器中,我們會捕捉任意Exception類或者其衍生類異常。這往往不利于我們識別問題,特別是一段程序可能拋出多種異常時。我們可以提供一個更加具體的類來捕捉。

 自定義異常

我們可以通過繼承來創建新的異常類。在繼承時,我們往往需要重寫構造方法。異常有兩個構造方法,一個沒有參數,一個有一個String參數。比如:

class BatteryUsageException extends Exception{  public BatteryUsageException() {}  public BatteryUsageException(String msg) {    super(msg);  }}

我們可以在衍生類中提供更多異常相關的方法和信息。

 在自定義異常時,要小心選擇所繼承的基類。一個更具體的類要包含更多的異常信息,比如IOException相對于Exception。

 總結

異常處理是在解決問題,同時也是在制造問題。大型項目中,過多、過細的異常處理往往會導致程序變得一團糟。異常處理的設計并不簡單,并需要謹慎使用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
琪琪亚洲精品午夜在线| 欧美性受xxx| 最近2019年好看中文字幕视频| 精品高清一区二区三区| 欧美孕妇性xx| 欧美福利视频在线观看| 亚洲欧美日韩第一区| 国内精品视频久久| 韩国精品久久久999| 91免费国产视频| 亚洲国产女人aaa毛片在线| 伊人亚洲福利一区二区三区| 国产精品jvid在线观看蜜臀| 有码中文亚洲精品| 欧美一级大胆视频| 国产精品久久久久久久久久| 亚洲精品网站在线播放gif| 亚洲人成电影在线观看天堂色| 成人中文字幕+乱码+中文字幕| 久久国产精品视频| 久久精品国产一区二区三区| 91在线观看免费| 国产午夜精品美女视频明星a级| 社区色欧美激情 | 日韩av电影国产| 91久久夜色精品国产网站| 国产精品v片在线观看不卡| 欧美大片网站在线观看| 日日噜噜噜夜夜爽亚洲精品| 亚洲二区中文字幕| 91九色在线视频| 国产精品欧美日韩| 亚洲国产日韩一区| 激情成人中文字幕| 国产亚洲精品久久久久久牛牛| 国产亚洲精品久久久久久| 欧美激情视频三区| 91tv亚洲精品香蕉国产一区7ujn| 欧美激情欧美狂野欧美精品| 亚洲天堂网站在线观看视频| 亚洲大胆人体视频| 国产精品一区二区三区久久| 欧美亚洲另类在线| 午夜精品久久久久久久99热浪潮| 日本91av在线播放| 亚洲一区999| 69av成年福利视频| 精品五月天久久| 美女福利精品视频| 日本欧美爱爱爱| 日韩欧美亚洲范冰冰与中字| 亚洲最大的成人网| 久久久久久久久爱| 97碰碰碰免费色视频| 国产一区深夜福利| 国产视频亚洲精品| 欧美国产日韩免费| 欧美精品一二区| 亚洲国产精久久久久久久| 日韩精品久久久久久久玫瑰园| 亚洲va欧美va国产综合久久| 日韩av免费一区| 亚洲自拍偷拍网址| 久久久久久一区二区三区| 欧美极品在线播放| 日韩亚洲成人av在线| 理论片在线不卡免费观看| 欧洲一区二区视频| 日韩久久免费视频| 久久久免费精品| 国内精品久久久久久中文字幕| 亚洲精品日韩激情在线电影| 波霸ol色综合久久| 伊人久久久久久久久久久| 久久视频免费在线播放| 国内伊人久久久久久网站视频| 影音先锋日韩有码| 日韩电影中文字幕| 亚洲天堂第二页| 78色国产精品| 日韩av资源在线播放| 韩国福利视频一区| 亚洲 日韩 国产第一| 亚洲欧美中文另类| 97碰碰碰免费色视频| 欧美激情一区二区三区久久久| 欧美激情亚洲视频| 国产成人欧美在线观看| 中文字幕在线亚洲| 亚洲免费一级电影| 亚洲成人999| 蜜臀久久99精品久久久久久宅男| 亚洲综合视频1区| 国产精品wwww| 2020久久国产精品| 国产激情综合五月久久| 亚洲国产精品va在线看黑人动漫| 91成人在线播放| 国产成人精品在线播放| 最近2019中文字幕在线高清| 亚洲人成啪啪网站| 亚洲娇小xxxx欧美娇小| 在线电影欧美日韩一区二区私密| 992tv在线成人免费观看| 亚洲一区二区福利| 亚洲女人天堂网| 国产精品爱啪在线线免费观看| 日本中文字幕不卡免费| 中文字幕在线看视频国产欧美在线看完整| 国产视频亚洲精品| 综合欧美国产视频二区| 久久精品国产亚洲一区二区| 欧美在线xxx| 欧洲成人免费视频| 久久久av网站| 在线成人中文字幕| 成人欧美在线视频| 久久久久成人网| 欧美性猛交99久久久久99按摩| 国产婷婷色综合av蜜臀av| 国产精品久久精品| 国产盗摄xxxx视频xxx69| 日韩视频在线观看免费| 日韩免费在线观看视频| 欧美日韩美女在线| 最新91在线视频| 亚洲精品国产精品乱码不99按摩| 国产欧美精品在线| 91精品国产高清自在线| 91国产视频在线| 精品国产欧美成人夜夜嗨| 日韩在线欧美在线国产在线| 91在线观看欧美日韩| 日韩美女在线观看一区| 国产精品av在线| 高清亚洲成在人网站天堂| 国产69久久精品成人看| 日韩暖暖在线视频| 国产伦精品一区二区三区精品视频| 色哟哟网站入口亚洲精品| 国产一区二区三区毛片| 日本乱人伦a精品| 性日韩欧美在线视频| 成人妇女免费播放久久久| 亚洲美女动态图120秒| 欧美巨猛xxxx猛交黑人97人| 国产精品美女久久久久av超清| 91免费国产视频| 最近2019年好看中文字幕视频| 国产精品久久久av| 欧美大片在线免费观看| 亚洲精品美女久久久久| 亚洲精品小视频| 国产精品影院在线观看| 久久中文字幕在线视频| 国产一区二区三区视频| 久久亚洲电影天堂| 热草久综合在线| 福利视频导航一区| 日韩成人网免费视频| 国产精品日韩电影| 国产亚洲一区精品| 国产成人精品视频在线观看| 欧美激情亚洲综合一区|