java語言入門 (四)異常處理 (1)
本篇知識目標
1.0 瞭解異常繼承層次及常見的系統異常
2.0 瞭解使用者定義異常的要求
3.0 掌握try{…..}catch(.. ..){….}finally{….} 的使用
掌握throw 與throws 的差異
據說當你百分之80的時間都在處理這些異常的時候你就是大師了
1.0 異常的概念
1.1 什麼是異常
異常指的是程式執行時出現的非正常情況
例如除數是0 陣列大小是10 你訪問的確實第11個元素等
異常處理的特點是對可能出現的異常程式碼段進行try嘗試,如果出現異常,則用catch將其捕獲並且處理。
1.2 異常的類層次
最高層次的類
T0 Throwable
T1 Error Exception //這兩個類都繼承T0的這個類
T2 …….. //這裡有很多的異常 都繼承 T1 中的某個類
Error是JVM 系統內部錯誤我們自己編寫的程式無法處理
Exception 是我們寫的程式的問題 可以處理
有的異常例如IOException 系統會提示我們必須對他可能的異常進行處理,否則編譯不通過
1.3 系統定義的異常
Exception 有很多類 每個類代表一種特定的執行時的錯誤,這些類中有的是系統定義好的並且封裝在java類庫中的,稱為系統定義的執行異常如下詳細查詢api文件
系統定義的異常 | 異常的解釋 |
---|---|
ClassNotFoundException | 沒有找到要裝載的類 |
ArrayIndexOutOfBoundsException | 陣列訪問越界 |
FileNotFoundException | 檔案找不到 |
IOexception | 輸入輸出錯誤 |
NullPointerException | 空指標訪問 |
ArithmeticException | 除數為0 算數運算錯誤 |
NumberFormatException | 數字格式錯誤 |
InterruptedException | 中斷異常 |
2.0異常的處理結構
下面是異常處理語句的格式(jdk 1.7以上還有別的寫法 這麼寫依然對)
try{
語句塊
}catch(異常型別名 引數名){
語句塊
}finally{
語句塊
}
幾點說明:
1. 可能會產生異常的語句塊在try中 一個try可以引導多個catch
2. 異常發生後try後面的語句將不會被執行
3. catch裡的語句塊會執行的標識是 try中會發生異常,並且異常型別與catch(異常型別名 引數名)
中的異常型別一致,則相應的catch內的語句就會執行
4. finally可以沒有 但是如果有的話 無論是否發生異常,他都會執行,除非遇到System.exit(0)
下面我們來看例子
package exception;
public class exceptiona {
void setException(Object size){
int arr[] = {1,2,3,4,5};//數字大小是5
try{
int sizea = (int)size;
int s = sizea+1;
System.out.println("第"+s+"個數組的值是"+arr[sizea]);
System.out.println("如果上面沒有異常 那麼這句話會被執行");
}catch(ArrayIndexOutOfBoundsException ex ){
System.out.println("陣列越界了 老鐵"+ex);
}catch(ClassCastException es){
System.out.println("老鐵格式錯誤了");
}catch(Exception a) {//exception 是所有異常的父類 可以接受任何異常
// 如果其他catch
// 捕獲的異常型別沒有 則會執行這個異常
System.out.println("異常名字是"+a);
}finally{
System.out.println("finally可以有 也可以沒有 有的話一定會被執行");
}
}
public static void main(String[] args) {
exceptiona exceptiona = new exceptiona();
exceptiona.setException(10);
}
}
結果
如果把exceptiona.setException(10); 中的10 變為 2
結果:
如果把如果把exceptiona.setException(10); 10變為”12” 也及時字串(因為Object 是任何型別的父類 所以可以接受字串)
結果
3.0 自定義異常
我們自己定義的話 要注意要繼承Exception類,一般包括構造方法 異常標識,toString方法
package exception;
public class MyException extends Exception{
String id; //異常的標識
public MyException(String id){
this.id = id;
}
public String toString(){
return "異常是"+id;
}
public static void main(String[] args) {
//捕獲自己的異常
try{
throw new MyException("沒事拋著玩");
}catch (MyException e) {
System.out.println(e);
}
}
}
結果:
異常是沒事拋著玩
這裡注意自己定義的異常只能用 throw丟擲 才會被catch捕獲 切catch的異常型別應該是自己定義的型別
下面我們說另一個關鍵字 throws 他的意思是 這個方法不處理 留給呼叫這個函式的方法處理
我在做這個自定義測試的時候 用的jdk1.8的時候 報錯 是通過更換jdk版本解決 換低版本的就ok
package exception;
public class exceptiona {
void setException(Object size) throws ArrayIndexOutOfBoundsException{//在這丟擲異常
int arr[] = {1,2,3,4,5};//數字大小是5
int sizea = (int)size;
int s = sizea+1;
System.out.println("第"+s+"個數組的值是"+arr[sizea]);
System.out.println("如果上面沒有異常 那麼這句話會被執行");
// try{
//
// }catch(ArrayIndexOutOfBoundsException ex ){
// System.out.println("陣列越界了 老鐵"+ex);
// }catch(ClassCastException es){
// System.out.println("老鐵格式錯誤了");
// }catch(Exception a) {//exception 是所有異常的父類 可以接受任何異常 如果其他catch
// // 捕獲的異常型別沒有 則會執行這個異常
// System.out.println("異常名字是"+a);
// }finally{
// System.out.println("finally可以有 也可以沒有 有的話一定會被執行");
// }
}
public static void main(String[] args) {
exceptiona exceptiona = new exceptiona();
//上個函式丟擲的異常 會在這處理 如果不處理 可以在這個方法裡接著丟擲被jvm處理
try {
exceptiona.setException(12);
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("陣列越界了 老鐵"+ex);
}
}
}
結果:
package exception;
public class exceptiona {
void setException(Object size) throws ArrayIndexOutOfBoundsException{
int arr[] = {1,2,3,4,5};//數字大小是5
int sizea = (int)size;
int s = sizea+1;
System.out.println("第"+s+"個數組的值是"+arr[sizea]);
System.out.println("如果上面沒有異常 那麼這句話會被執行");
// try{
//
// }catch(ArrayIndexOutOfBoundsException ex ){
// System.out.println("陣列越界了 老鐵"+ex);
// }catch(ClassCastException es){
// System.out.println("老鐵格式錯誤了");
// }catch(Exception a) {//exception 是所有異常的父類 可以接受任何異常 如果其他catch
// // 捕獲的異常型別沒有 則會執行這個異常
// System.out.println("異常名字是"+a);
// }finally{
// System.out.println("finally可以有 也可以沒有 有的話一定會被執行");
// }
}
//這個函式不處理 交給JVM處理
public static void main(String[] args) throws ArrayIndexOutOfBoundsException{
exceptiona exceptiona = new exceptiona();
exceptiona.setException(12);
}
}
結果
歡迎評論 交流