java錯誤及異常

java錯誤及異常

程序運行過程中,可能會發生一些不被期望的效果,肯定會阻止我們的程序按照指令去執行
這種不被預期出現的效果,肯定需要拋出來告訴我們

在Java中有一個定義好的規則Throwable(可以拋出的)

Error錯誤
通常是一些物理性的,JVM虛擬機本身出現的問題,程序指令是處理不了的

Exception異常
通常是一種人爲規定的不正常的現象,通常是給定的程序指令產生了一些不符合規範的事情

Throwable類實現了一個序列化接口
Error(錯誤)       Exception(異常)
StackOverflowError    RuntimeException(運行時) IOException。。。。。
OutOfMemoryError

異常的分支體系

運行時異常

Error和RuntimeException都算作運行時異常
javac編譯的時候,不會提示和發現的,
在程序編寫時不要求必須做處理,如果我們願意可以添加處理手段(try throws)
要求大家出現這樣異常的時候 知道怎麼產生及如何修改

  1. InputMisMatchException 輸入不匹配
    int value = input.nextInt();// abc
  2. NumberFormatException 數字格式化
    int value = Integer.parseInt(“123.45”);
  3. NegativeArraySizeException 數組長度負數
    創建數組時,長度出現負數
    int[] array = new int[-2];
  4. ArrayIndexOutOfBoundsException 數組索引越界
    int[] array = {1,2,3};
    array[5];
  5. NullPointerException 空指針異常
    int[][] array = new int[3][];
    array[0][0] =10;
    Person p = null;
    p.getName();
  6. ArithmeticException 數字異常
    10/0 整數不允許除以0 Infinity小數除以0會產生無窮
  7. ClassCastException 造型異常
    將對象的類型還原時 與真實類型不匹配
    Person p = new Teacher();
    Student s = (Student)p;
  8. StringIndexOutOfBoundsException 字符串越界
    String str = “abc”;
    str.charAt(5);
  9. IndexOutOfBoundsException 集合越界
    List家族
    ArrayList list = new ArrayList();
    list.add(); list.add(); list.add();
    list.get(5);
  10. IllegalArgumentException 非法參數異常
    ArrayList list = new ArrayList(-1);
  11. StackOverflowError 棧內存溢出

編譯時異常(檢查異常)

除了Error和RuntimeException以外其他的異常
javac編譯的時候 強制要求我們必須爲這樣的異常做處理(try或throws)
因爲這樣的異常在程序運行過程中極有可能產生問題的
異常產生後後續的所有執行就停止啦
1.InterruptException
  try{
    Thread.sleep(5000);
   }catch(Exception e){
   }
後續還會有很多的編譯時異常

處理異常的手段

處理異常不是  異常消失了
處理異常指的是 處理掉異常之後 後續的代碼不會因爲此異常而終止執行

try{}catch(){}[ finally{} ]

  1. try不能單獨的出現
  2. 後面必須添加catch或finally
  3. catch有一組括號 (NullPointerException) 目的是爲了捕獲某一種異常
  4. catch可以有很多個存在
      捕獲的異常之間沒有任何的繼承關係
      捕獲的異常需要從小到大進行捕獲
  5. finally不是必須存在的
      若存在finally結構 則必須執行
      引申一個小問題: final finally finalize區別
        final 特徵修飾符 修飾變量 屬性 方法 類
            修飾變量 基本類型 值不能改變 引用類型 地址不能改變(如果變量沒有初值 給一次機會賦值)
            修飾屬性 特點與修飾變量類似 (要求必須給屬性賦初始值 否則編譯報錯)
            修飾方法 不能被子類重寫
            修飾類  不能被其他的子類繼承
        finally 處理異常手段的一部分
            try{}catch(){}後面的一個部分
            這個部分可有可無 如果有隻能含有一份 且必須執行
        finalize 是Object類中的一個protected方法
            對象沒有任何引用指向的時候 – 會被GC回收
            當對象回收的時候 默認調用finalize方法
            若想要看到對象回收的效果 可以重寫 public void finalize(){}
  6. 處理異常放在方法內部 可能還會有小問題
      如果在方法內部含有返回值
      不管返回值return關鍵字在哪裏 finally一定會執行完畢
      返回值的具體結果 看情況

throws拋出

  1. 異常只能在方法上拋出 屬性是不能處理異常的
  2. 方法 構造
  3. 方法可以拋出不止一個異常 通過,隔開
  4. 拋出的異常與多個catch類似 要麼沒關係 要麼先拋出小異常
我們也可以自己創建異常----自定義異常
  1. 自己描述一個異常的類
  2. 讓我們自己的類繼承
      如果繼承是RuntimeException---->運行時異常(不需要必須添加處理手段)
      如果繼承是Exception-------------->編譯時異常(必須添加處理手段)
  3. 創建一個當前自定義異常類的對象
      通過throw關鍵字 主動產生異常
  4. 當我們設計描述的方法(事情) 之前沒有相關的異常能描述我的問題Box
      這個時候纔會利用自定義異常來描述
發佈了31 篇原創文章 · 獲贊 0 · 訪問量 7219
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章