異常處理

異常處理

異常概述與異常體系結構

異常:在Java語言中,將程序執行中發生的不正常狀況稱爲「異常java

Java程序在執行過程當中所發生的異常事件可分爲兩類:程序員

  • Error:Java虛擬機沒法解決的嚴重問題
    • JVM系統內部錯誤、資源耗盡等嚴重情;如:StackOverflowError和OOM通常不編寫針對性的代碼進行處理。
  • Exception: 其它因編程錯誤或偶然的外在因素致使的通常性問題,可使用針對性的代碼進行處理
    • 空指針訪問
    • 試圖讀取不存在的文件
    • 網絡鏈接中斷
    • 數組角標越界

錯誤解決方法sql

遇到錯誤就終止程序的運行
由程序員在編寫程序時,就考慮到錯誤的檢測、錯誤消息的提示,以及錯誤的處理編程

運行時異常:是指編譯器不要求強制處置的異常;通常是指編程時的邏輯錯誤,是程序員應該積極避免其出現的異常;java.lang.RuntimeException類及它的子類都是運行時異常數組

編譯時異常:是指編譯器要求必須處置的異常;編譯器要求Java程序必須捕獲或聲明全部編譯時異常網絡

常見異常

  • java.lang.RuntimeExceptionide

    • ClassCastException
    • ArrayIndexOutOfBoundsException
    • NullPointerException
    • ArithmeticException
    • NumberFormatException
    • InputMismatchException
  • java.io.IOExeption 測試

    • FileNotFoundException
    • EOFException
  • java.lang.ClassNotFoundExceptionthis

  • java.lang.InterruptedException指針

  • java.io.FileNotFoundException

  • java.sql.SQLException

ArrayIndexOutOfBoundsException

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"
*/

NullPointerException

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" 
*/

ArithmeticException

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" 
*/

ClassCastException(類轉換異常)

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" 
*/

異常處理機制

  • Java提供的是異常處理的抓拋模型
  • Java程序的執行過程當中如出現異常,會生成一個異常類對象, 該異常對象將被提交給Java運行時系統,這個過程稱爲拋出 (throw)異常

異常對象的生成

  1. 虛擬機自動生成:程序運行過程當中,虛擬機檢測到程序發生了問題,若是在當前代碼中沒有找到相應的處理程序,就會在後臺自動建立一個對應異常類的實例對象並拋出——自動拋出
  2. 由開發人員手動建立
  • 若是一個方法內拋出異常,該異常對象會被拋給調用者方法中處理。若是異常沒有在調用者方法中處理,它繼續被拋給這個調用方法的上層方法這個過程將一直繼續下去,直到異常被處理。 這一過程稱爲捕獲(catch)異常
  • 程序員一般只能處理Exception,而對Error無能爲力

try-catch-finally

語法:

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塊中的語句都會被執行

throws:聲明拋出異常

  • 若是一個方法(中的語句執行時)可能生成某種異常,可是並不能肯定如何處理這種異常,則此方法應顯示地聲明拋出異常,代表該方法將不對這些異常進行處理,而由該方法的調用者負責處理
  • 在方法聲明中用throws語句能夠聲明拋出異常的列表,throws後面的異常類型能夠是方法中產生的異常類型,也能夠是它的父類
public void readFile(String file) throws FileNotFoundException{
    ……
        // 讀文件的操做可能產生FileNotFoundException類型的異常
        FileInputStream fis = new FileInputStream(file);
    ……
}

重寫方法不能拋出比被重寫方法範圍更大的異常類型。在多態的狀況下,對父類方法的調用-異常的捕獲按父類聲明的異常處理

手動拋出異常

  1. 通常地,用戶自定義異常類都是RuntimeException的子類
  2. 自定義異常類一般須要編寫幾個重載的構造器
  3. 自定義異常須要提供serialVersionUID
  4. 自定義的異常經過throw拋出
  5. 自定義異常最重要的是異常類的名字,當異常出現時,能夠根據名字判斷異常類型

用戶自定義異常類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();
    }
}
相關文章
相關標籤/搜索