異常就是java程序在運行過程當中出現的錯誤java
main方法收到問題時,有兩種是處理方式程序員
本身將問題處理,而後運行數組
本身沒有針對問題的處理方式,只有交給調用main的jvm來處理,並將異常名稱,異常信息,異常出現的位置jvm
打印在了控制檯上,同時將程序中止運行(也就是報錯)。this
try時用來檢測異常spa
catch是用來捕獲異常指針
finally 釋放資源code
1 int i = 5; 2 int b = 0; 3 try { 4 int c = i/5; 5 } catch (Exception e) { 6 System.out.println(e.getMessage()); // 查看異常信息 7 }
1
try...catch的方式處理多個異常對象
JDK7之後處理多個異常的方式及注意事項blog
int i = 5; 2 int b = 0; 3 try { 4 int c = i / 5; 5 } catch (ArithmeticException e) {//只能夠捕獲除零錯誤 6 System.out.println("除數不能爲零"); 7 } catch (ArrayIndexOutOfBoundsException e) {//只能夠捕獲下標越界 8 System.out.println("索引越界了"); 9 10 } catch (Exception e) { // Exception e = new NullPointerException(); 11 // 若是把全部的錯誤都放入Exception裏面,徹底能夠接收異常信息,可是不利於錯誤的查找 12 System.out.println("出錯了"); 13 } 14 System.out.println("over");
被finally控制的語句體必定會執行
特殊狀況:執行到finally 以前 jvm退出了System.exit(0))
finally的做用:用於釋放資源,在IO流操做和數組庫操做中會見到
IO流是須要打開的,打開以後須要關閉,在finally裏面關閉
finally強大到用return結束方法也會執行
1 int i = 5; 2 int b = 0; 3 try { 4 int c = i / 5; 5 //直接退出java虛擬機這是系統級別的退出,jvm不在運行 6 System.exit(0); 7 } catch (Exception e) { 8 System.out.println("出錯了"); 9 }finally { 10 //try當中不管是渝澳catch,仍是return語句他都會執行 11 //除非退出java虛擬機
//當出現java虛擬機退出時,finally中的語句就不會運行了,java程序直接終止運行
12 System.out.println("aaaaaaaaaaaaaaaaaaaa"); 13 } 14 System.out.println("over");
java中異常被分爲兩類,編譯器異常和運行時異常,
當上面出現了add或者surround的時候,就是程序出現了編譯器的異常信息,解決方法時要麼使用throws或者時使用trycatch進行包圍,才能使程序正常運行
編譯時異常:在編譯某個程序的時候,有可能會有這樣那樣的事情發生,好比文件找不到,這樣的異常就必須在編譯的時候處理
若是不處理編譯通不過
運行時異常:就是程序員所犯得錯誤,須要回來修改代碼
就像空指針的時候你不賦值爲null.索引越界異常,你不越界
getMessage() 獲取異常信息,返回字符串
toString() 獲取異常類名和異常信息,返回字符串
printStackTrace() 獲取異常類名和異常信息,以及異常出如今程序中的位置,返回值void
1 public static void main(String[] args) throws Exception { 2 Student s = new Student(); 3 s.setAge(-13); 4 } 5 6 7 8 9 public void setAge(int age) throws Exception { 10 if(age > 0 && age < 150) { 11 this.age = age; 12 }else { 13 throw new RuntimeException("年齡輸入有誤"); 14 } 15 }
1.在功能方法內部出現某種狀況,程序不能繼續運行,須要進行跳轉時,就把異常對象拋出
2.一個方法在使用throws進行拋出異常時,若是其餘方法調用了該方法,那麼調用方法必須也要拋出對應的異常,
或者是使用try...catch 語句進行捕獲該異常
throws:
用在方法聲明的後面,跟的是異常類名
能夠跟多個異常類名,用逗號隔開
表示拋出異常,有該方法的調用者來處理
throw
用在方法體,跟的是異常對象名
1 /** 2 * 3 * @param args 4 * @throws AgeOutOfBoundsException 自定義異常 5 */ 6 public static void main(String[] args) throws AgeOutOfBoundsException { 7 Person p = new Person(); 8 // 捕獲異常 9 try{ 10 p.setAge(17); 11 System.out.println(p.getAge()); 12 }catch (Exception e){ 13 System.out.println("年齡非法"); 14 } 15 } 16 } 17 18 package com.jhedu.day20; 19 public class Person { 20 private String name; 21 private int age; 22 public Person() { 23 super(); 24 } 25 public Person(String name, int age) { 26 super(); 27 this.name = name; 28 this.age = age; 29 } 30 public String getName() { 31 return name; 32 } 33 public void setName(String name) { 34 this.name = name; 35 } 36 public int getAge() { 37 return age; 38 } 39 public void setAge(int age) throws AgeOutOfBoundsException { 40 if(age >0 && age <= 150) { 41 this.age = age; 42 }else { 43 throw new AgeOutOfBoundsException("年齡非法"); 44 } 45 } 46 } 47 48 package com.jhedu.day20; 49 public class AgeOutOfBoundsException extends Exception { 50 // 空參數的構造方法 51 public AgeOutOfBoundsException() { 52 super(); // 調用父類Exception的構造方法 53 } 54 // 有參數的構造方法 55 public AgeOutOfBoundsException(String message) { 56 super(message); // 調用父類Exception的有參數構造方法 57 }
只能拋出一個異常對象名
表示拋出異常,有方法體內的語句處理
異常有不少子類就是爲了讓你更好的知道拋出的是啥異常,爲了有利於你排錯,抱不一樣異常表明不一樣的錯誤,看了名字就知道犯了什麼錯誤,就是爲了有個名字而已,所做的事情父類都去作了。
1.子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異類的子類。
2.若是父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或是他的子類,子類不能拋出父類沒有的異常
3.若是被重寫的方法沒有異常拋出,那麼子類的方法絕對不能夠拋出異常,若是子類方法內有異常發生,那麼子類只能try,不能throws
如何使用異常處理:若是該功能內部能夠將問題處理,用try,若是處理不了,交給調用者處理。。這是throws
區別:後續程序須要繼續就運行try
後續程序不須要運行就throws
若是jdk沒有提供相對相應的異常,須要自定義異常