異常:在Java語言中,將程序執行中發生的不正常狀況稱爲「異常」java
Java程序在執行過程當中所發生的異常事件可分爲兩類:程序員
StackOverflowError和OOM
。通常不編寫針對性的代碼進行處理。錯誤解決方法sql
遇到錯誤就終止程序的運行
由程序員在編寫程序時,就考慮到錯誤的檢測、錯誤消息的提示,以及錯誤的處理編程
運行時異常:是指編譯器不要求強制處置的異常;通常是指編程時的邏輯錯誤,是程序員應該積極避免其出現的異常;java.lang.RuntimeException
類及它的子類都是運行時異常數組
編譯時異常:是指編譯器要求必須處置的異常;編譯器要求Java程序必須捕獲或聲明全部編譯時異常網絡
java.lang.RuntimeException
ide
ClassCastException
ArrayIndexOutOfBoundsException
NullPointerException
ArithmeticException
NumberFormatException
InputMismatchException
java.io.IOExeption
測試
FileNotFoundException
EOFException
java.lang.ClassNotFoundException
this
java.lang.InterruptedException
指針
java.io.FileNotFoundException
java.sql.SQLException
public class IndexOutExp { public static void main(String[] args) { String friends[] = { "lisa", "bily", "kessy" }; for (int i = 0; i < 5; i++) { System.out.println(friends[i]); //friends[4]? } System.out.println("\nthis is the end"); } } /* 程序IndexOutExp.java編譯正確,運行結果:java IndexOutExp lisa bily kessy java.lang.ArrayIndexOutOfBoundsException at Test7_1.main(Test7_1.java:5) Exception in thread "main" */
public class NullRef { int i = 1; public static void main(String[] args) { NullRef t = new NullRef(); t = null; System.out.println(t.i); } } /* 程序NullRef.java編譯正確,運行結果:java NullRef java.lang.NullPointerException at NullRef.main(NullRef.java:6) Exception in thread "main" */
public class DivideZero { int x; public static void main(String[] args) { int y; DivideZero c=new DivideZero(); y=3/c.x; System.out.println("program ends ok!"); } } /* 程序DivideZero.java編譯正確,運行結果:java DivideZero java.lang.ArithmeticException: / by zero at DivideZero.main(DivideZero.java:6) Exception in thread "main" */
public class Order { public static void main(String[] args) { Object obj = new Date(); Order order; order = (Order) obj; System.out.println(order); } } /* 程序Person.java編譯正確,運行結果:java Person java.lang. java.lang.ClassCastException at Person.main(Person.java:5) Exception in thread "main" */
異常對象的生成
- 虛擬機自動生成:程序運行過程當中,虛擬機檢測到程序發生了問題,若是在當前代碼中沒有找到相應的處理程序,就會在後臺自動建立一個對應異常類的實例對象並拋出——自動拋出
- 由開發人員手動建立
語法:
try{ ...... //可能產生異常的代碼 } catch( ExceptionName1 e ){ ...... //當產生ExceptionName1型異常時的處置措施 } catch( ExceptionName2 e ){ ...... //當產生ExceptionName2型異常時的處置措施 } finally{ ...... //不管是否發生異常,都無條件執行的語句 }//finall可寫可不寫
try:捕獲異常的第一步是用try{…}語句塊選定捕獲異常的範圍,將可能出現 異常的代碼放在try語句塊中
catch (Exceptiontype e) :在catch語句塊中是對異常對象進行處理的代碼。每一個try語句塊能夠伴隨 一個或多個catch語句,用於處理可能產生的不一樣類型的異常對象
捕獲異常的有關信息: 與其它對象同樣,能夠訪問一個異常對象的成員變量或調用它的方法
getMessage()
獲取異常信息,返回字符串
printStackTrace()` 獲取異常類名和異常信息,以及異常出如今程序中的位置;返回值void
finally:不論在try代碼塊中是否發生了異常事件,catch語句是否執行,catch語句是否有異常,catch語句中是否有return,finally塊中的語句都會被執行
public void readFile(String file) throws FileNotFoundException{ …… // 讀文件的操做可能產生FileNotFoundException類型的異常 FileInputStream fis = new FileInputStream(file); …… }
重寫方法不能拋出比被重寫方法範圍更大的異常類型。在多態的狀況下,對父類方法的調用-異常的捕獲按父類聲明的異常處理
RuntimeException
的子類serialVersionUID
用戶自定義異常類
MyException
,用於描述數據取值範圍錯誤信息;用戶本身的異常類必須繼承現有的異常類
//自定義類 class MyException extends Exception { static final long serialVersionUID = 13465653435L; private int idnumber; public MyException(String message, int id) { super(message); this.idnumber = id; } public int getId() { return idnumber; } } //測試類 public class MyExpTest { public void regist(int num) throws MyException { if (num < 0) throw new MyException("人數爲負值,不合理", 3); else System.out.println("登記人數" + num); } public void manager() { try { regist(100); } catch (MyException e) { System.out.print("登記失敗,出錯種類" + e.getId()); } System.out.print("本次登記操做結束"); } public static void main(String args[]) { MyExpTest t = new MyExpTest(); t.manager(); } }