Java異乘焦桑總結(jié)

異常

概念

異常是程序運行過程中可能發(fā)生的一類事件。

當方法中發(fā)生錯誤時倡鲸,該方法會創(chuàng)建一個對象——異常對象——并將其交給runtime system(該過程稱為 拋出異常)。

異常對象包含了錯誤信息克滴,包括錯誤發(fā)生時的類型和程序狀態(tài)逼争。

當異常被拋出時劝赔,runtime system會從調(diào)用堆棧里尋找可以處理該異常的方法(exception handler),當找到合適的exception handler時杂伟,即稱為catch the exception仍翰;如果runtime system找不到合適的exception handler,則程序終止予借。

異常的處理與聲明規(guī)則

  • 使用try-catch-finally語句來捕獲和處理異常

    • try塊包含可能拋出異常的語句

      catch塊是異常的接收者,用于處理異常

      finally塊包含無論是否發(fā)生異常均需要運行的語句

    例如:

    public int getNumberFromArray(int[] array, int index) {
      try {
        return array[index];
      } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("數(shù)組越界異常:" + e);
      }
    }
    
    • try-catch-finally規(guī)則:
      • 必須在 try 之后添加 catch (至少一個)或 finally 塊秦叛。
      • 必須遵循塊順序:若同時使用 catch 和 finally 塊龟再,則順序為:try-catch-finally
      • 當一個 try 塊有多個 catch 時,執(zhí)行第一個能匹配的塊利凑。
      • 可嵌套 try-catch-finally 結(jié)構(gòu)。
      • 在 try-catch-finally 結(jié)構(gòu)中哀澈,可重新拋出異常。
      • 除了下列情況膨报,總將執(zhí)行 finally 做為結(jié)束:
        • JVM 過早終止(調(diào)用 System.exit(int))适荣;
        • 在 finally 塊中拋出一個未處理的異常;
        • 計算機斷電弛矛、失火、或遭遇病毒攻擊丈氓。
  • 使用throw語句聲明異常

    例如:

    public int getNumberFromArray(int[] array, int index) throws ArrayIndexOutOfBoundsException {
      if (index > array.length) {
        throw new ArrayIndexOutOfBoundsException("數(shù)組越界異常");
      }
      return array[index];
    }
    
    • throw規(guī)則:
      • 必須聲明方法可拋出的任何checked exception强法。
      • error和runtime exception不是必須聲明的湾笛。
      • 調(diào)用方法必須遵循任何checked exception的處理和聲明規(guī)則。聲明的任何異常必須是被覆蓋方法所聲明異常的同類或子類蓖墅。

但并非所有異常都適用于上述規(guī)則嘉赎。

三類異常

  • checked exception

    該類異常是可預測、可修復的

    如:FileNotFoundException公条、ArrayIndexOutOfBoundException

    checked exceptions適用于前述異常處理與聲明規(guī)則迂曲,該類異常如果沒有經(jīng)過遵循前述規(guī)程的exception handler處理,則會編譯不通過路捧。

  • error

    該類異常是發(fā)生于應用程序外部的特例,往往無法預測和修復

    如:IOError队寇、OutOfMemoryError

    errors不適用于前述異常處理與聲明規(guī)則

  • runtime exception

    該類異常是發(fā)生于應用程序內(nèi)部的特例章姓,同樣難以預測和修復。該類異常通常表示程序存在bug凡伊,例如邏輯bug或API的不當使用。

    如:NullPointerException系忙、ArithmeticException

    runtime exceptions不適用于前述異常處理與聲明規(guī)則

除以上三種類型外,還可以自定義異常风宁。

常見異常舉例

  • Java.lang.NullPointException

    public class Main {
    
      public static void main(String[] args) {
        int[][] arr = new int[2][];
        try {
          arr[0][1] = 1;
        } catch (NullPointerException e) {
          System.out.println("發(fā)生異常:" + e.getMessage());
        }
      }
    }
    // 輸出:
    // 發(fā)生異常:null
    
  • Java.lang.ClassNotFoundException

    public class Main {
    
      public static void main(String[] args) {
        try {
          Class.forName("anotherPackage");
        } catch (ClassNotFoundException e) {
          System.out.println("發(fā)生異常:" + e.getMessage());
        }
      }
    }
    // 輸出:
    // 發(fā)生異常:anotherPackage
    
  • Java.lang.ArithmeticException

    public class Main {
    
      public static void main(String[] args) {
        int a = 1;
        int b = 0;
        try {
          int result = a / b;
        } catch (ArithmeticException e) {
          System.out.println("發(fā)生異常:" + e.getMessage());
        }
      }
    }
    // 輸出:
    // 發(fā)生異常:/ by zero
    
  • Java.lang.ArrayIndexOutOfBoundsException

    public class Main {
    
      public static void main(String[] args) {
        int[] arr = new int[4];
        try {
          for (int i = 0; i < arr.length + 1; i++) {
            arr[i] = 1;
          }
        } catch (ArrayIndexOutOfBoundsException e) {
          System.out.println("發(fā)生異常:" + e.getMessage());
        }
      }
    }
    // 輸出:
    // 發(fā)生異常:4
    
  • Java.lang.IllegalArgumentException

    import java.lang.reflect.Array;
    
    public class Main {
    
      public static void main(String[] args) {
        try {
          int arr = 0;
          Array.getLength(arr);
        } catch (IllegalArgumentException e) {
          System.out.println("發(fā)生異常:" + e.getMessage());
        }
      }
    }
    // 輸出:
    // 發(fā)生異常:Argument is not an array
    
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末戒财,一起剝皮案震驚了整個濱河市苍苞,隨后出現(xiàn)的幾起案子狼纬,更是在濱河造成了極大的恐慌骂际,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘裕,死亡現(xiàn)場離奇詭異柠贤,居然都是意外死亡类缤,警方通過查閱死者的電腦和手機餐弱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門膏蚓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氓扛,你說我怎么就攤上這事采郎〕崧ィ” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵理茎,是天一觀的道長管嬉。 經(jīng)常有香客問我,道長蚯撩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任沟启,我火速辦了婚禮,結(jié)果婚禮上德迹,老公的妹妹穿的比我還像新娘。我一直安慰自己卸例,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布筷转。 她就那樣靜靜地躺著悬而,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笨奠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音眨八,去河邊找鬼。 笑死页响,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的闰蚕。 我是一名探鬼主播连舍,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼索赏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起埃儿,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤融涣,失蹤者是張志新(化名)和其女友劉穎精钮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轨香,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡悯衬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了策橘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娜亿。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖买决,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情督赤,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布丑婿,位于F島的核電站没卸,受9級特大地震影響羹奉,放射性物質(zhì)發(fā)生泄漏约计。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一耕挨、第九天 我趴在偏房一處隱蔽的房頂上張望铺然。 院中可真熱鬧俗孝,春花似錦魄健、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽良哲。三九已至,卻和暖如春筑凫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巍实。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工棚潦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留令漂,地道東北人丸边。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像纬朝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子玄组,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容