1. 程式人生 > 其它 >java基礎筆記-異常

java基礎筆記-異常

五 異常

​ 沒有完美的程式設計師,也沒有完美的機器,真要是崩了,不寫異常就直接error退出了

​ 異常分為兩種:

​ >Error:stackOverflowError(棧溢位,沒設定出口),OOM(OutOfMemory)

​ >Exception 程式設計原因,偶然因素,問題不大,還能挽救下

​ 空指標異常

​ 檔案讀取不到

​ 網路連線中斷

​ 陣列交表越界(區分與空指標)

1.異常分類

java.lang.Throwable
	|------java.lang.Error:一般不表寫針對性的程式碼處理
	|------java.lang.Exception:可以進行異常的處理
		|------編譯時異常(checked)
			|------IOXeception
				|------FileNotFoundException
			|------ClassNotFoundException
		|------RuntimeException:執行時異常(unchecked)
			|------NullPointerException
			|------ArrayIndexOutOfBoundsExecption
			|------ClassCastExcption 型別轉換異常
			|------NumberFormatException
			|------InputMismatchException 輸入異常,比如給了nextInt一個字串
			|------ArithmaticException 算數運算異常

2.異常處理:

​ try-catch-finally

​ 有可能出事,那我放在try裡,出事瞭如果我能解決,就catch

​ throws

​ 我解決不了,我往上報(給呼叫方),直到一個能解決的,上報到main還解決不了,大家一起完蛋

​ 做法:

​ >try裡面執行,遇到異常之後,jvm就會生成一個對應異常的物件,並將此物件丟擲,後面的的程式碼就不運行了

​ >catch異常的處理方式:try-catch-finally 或者 throws

​ 使用try-catch處理編譯時異常, 使其不報錯,但是執行時仍可能報錯,相當於將編譯時異常延遲成執行時異常

​ 執行時異常比較常見,一般不做處理,

2.1 try-catch-finally

如果宣告的異常存在子父類關係,子類必須放前面

常用的異常處理方式

​ >System.out.pringln(e.getMessage());

​ >e.printStackTrace();

try{

}catch(異常型別1 物件名1){
    //處理異常的方式
}catch(異常型別2 物件名2){
    //給你機會了,你得把握住
}finally{
	//一定會執行的程式碼
    比如一些物理的連線:socket,io流,資料庫連線,等需要手動連線(防止catch裡仍有異常)
}

2.2 throws

如果讓main也拋,則會拋給虛擬機器,解決不了的掛掉

public void method() throws FileNotFoundException,IOException{
	File file =new File("12.txt");
	FileInputStream  fis =  new FileInputStream(file);
	int data= fis.read();
	while(data!= -1){
		sout((char)data);
		data= fis.read();
	}
	fis.close();
} 
public void method2()throws FileNotFoundException,IOException {
    method1();
}
main()throws FileNotFoundException,IOException {//方式1
    try{    
    	method2();
    }catch (IOException e){
        e.printStackTrace();
    }
}

2.3重寫方法 涉及的異常

​ 子類重寫的方法丟擲的異常型別不大於父類被重寫的方法丟擲的異常

​ 因為多型

​ 父類沒用throws,則子類也不能用,意味著子類只能用trycatch

2.4手動丟擲異常

​ 之前,異常都是系統自動生成的。

​ 可以手動產生一個異常物件,並丟擲(throw)

class Student{
	private int id;
    public void regist(int id){
        if(id>0){
            thid.id=id;
        }else{
            //手動丟擲異常
            throw new RuntimeException("輸入資料錯誤");
        }
    }
}

2.5自定義一個異常類

​ 1.繼承一個異常 RunTimeException(不用顯式的處理),Exception(需要處理)

​ 2.提供一個全域性常量serialVersionUID

​ 3.提供過載的構造方法

class MyException extends RunTimeException{
    static final long serialVersionUID = -793489746458756785678L//序列化的唯一標識號
    public MyException(){
    }   
    public MyException(String msg){
        super(msg);
    }
        
}