java錯誤及異常
程序運行過程中,可能會發生一些不被期望的效果,肯定會阻止我們的程序按照指令去執行
這種不被預期出現的效果,肯定需要拋出來告訴我們
在Java中有一個定義好的規則Throwable(可以拋出的)
Error錯誤
通常是一些物理性的,JVM虛擬機本身出現的問題,程序指令是處理不了的
Exception異常
通常是一種人爲規定的不正常的現象,通常是給定的程序指令產生了一些不符合規範的事情
Throwable類實現了一個序列化接口
Error(錯誤) Exception(異常)
StackOverflowError RuntimeException(運行時) IOException。。。。。
OutOfMemoryError
異常的分支體系
運行時異常
Error和RuntimeException都算作運行時異常
javac編譯的時候,不會提示和發現的,
在程序編寫時不要求必須做處理,如果我們願意可以添加處理手段(try throws)
要求大家出現這樣異常的時候 知道怎麼產生及如何修改
- InputMisMatchException 輸入不匹配
int value = input.nextInt();// abc - NumberFormatException 數字格式化
int value = Integer.parseInt(“123.45”); - NegativeArraySizeException 數組長度負數
創建數組時,長度出現負數
int[] array = new int[-2]; - ArrayIndexOutOfBoundsException 數組索引越界
int[] array = {1,2,3};
array[5]; - NullPointerException 空指針異常
int[][] array = new int[3][];
array[0][0] =10;
Person p = null;
p.getName(); - ArithmeticException 數字異常
10/0 整數不允許除以0 Infinity小數除以0會產生無窮 - ClassCastException 造型異常
將對象的類型還原時 與真實類型不匹配
Person p = new Teacher();
Student s = (Student)p; - StringIndexOutOfBoundsException 字符串越界
String str = “abc”;
str.charAt(5); - IndexOutOfBoundsException 集合越界
List家族
ArrayList list = new ArrayList();
list.add(); list.add(); list.add();
list.get(5); - IllegalArgumentException 非法參數異常
ArrayList list = new ArrayList(-1); - StackOverflowError 棧內存溢出
編譯時異常(檢查異常)
除了Error和RuntimeException以外其他的異常
javac編譯的時候 強制要求我們必須爲這樣的異常做處理(try或throws)
因爲這樣的異常在程序運行過程中極有可能產生問題的
異常產生後後續的所有執行就停止啦
1.InterruptException
try{
Thread.sleep(5000);
}catch(Exception e){
}
後續還會有很多的編譯時異常
處理異常的手段
處理異常不是 異常消失了
處理異常指的是 處理掉異常之後 後續的代碼不會因爲此異常而終止執行
try{}catch(){}[ finally{} ]
- try不能單獨的出現
- 後面必須添加catch或finally
- catch有一組括號 (NullPointerException) 目的是爲了捕獲某一種異常
- catch可以有很多個存在
捕獲的異常之間沒有任何的繼承關係
捕獲的異常需要從小到大進行捕獲 - finally不是必須存在的
若存在finally結構 則必須執行
引申一個小問題: final finally finalize區別
final 特徵修飾符 修飾變量 屬性 方法 類
修飾變量 基本類型 值不能改變 引用類型 地址不能改變(如果變量沒有初值 給一次機會賦值)
修飾屬性 特點與修飾變量類似 (要求必須給屬性賦初始值 否則編譯報錯)
修飾方法 不能被子類重寫
修飾類 不能被其他的子類繼承
finally 處理異常手段的一部分
try{}catch(){}後面的一個部分
這個部分可有可無 如果有隻能含有一份 且必須執行
finalize 是Object類中的一個protected方法
對象沒有任何引用指向的時候 – 會被GC回收
當對象回收的時候 默認調用finalize方法
若想要看到對象回收的效果 可以重寫 public void finalize(){} - 處理異常放在方法內部 可能還會有小問題
如果在方法內部含有返回值
不管返回值return關鍵字在哪裏 finally一定會執行完畢
返回值的具體結果 看情況
throws拋出
- 異常只能在方法上拋出 屬性是不能處理異常的
- 方法 構造
- 方法可以拋出不止一個異常 通過,隔開
- 拋出的異常與多個catch類似 要麼沒關係 要麼先拋出小異常
我們也可以自己創建異常----自定義異常
- 自己描述一個異常的類
- 讓我們自己的類繼承
如果繼承是RuntimeException---->運行時異常(不需要必須添加處理手段)
如果繼承是Exception-------------->編譯時異常(必須添加處理手段) - 創建一個當前自定義異常類的對象
通過throw關鍵字 主動產生異常 - 當我們設計描述的方法(事情) 之前沒有相關的異常能描述我的問題Box
這個時候纔會利用自定義異常來描述