天天看點

黑馬程式員——java基礎:異常學習日志

------- android教育訓練、java教育訓練、期待與您交流! ----------

1:什麼是異常:

是對問題的描述。将問題進行對象的封裝。

------------

2:異常體系:

       Throwable

              |--Error

              |--Exception

                     |--RuntimeException

------------

:3:異常體系的特點:異常體系中的所有類以及建立的對象都具備可抛性。也就是說可以被throw和throws關鍵字所操作。隻有異常體系具備這個特點。

------------

4:throw和throws的用法:

throw定義在函數内,用于抛出異常對象。

throws定義在函數上,用于抛出異常類,可以抛出多個用逗号隔開。

當函數内容有throw抛出異常對象,并未進行try處理。必須要在函數上聲明,都在編譯失敗。RuntimeException除外。函數内如果抛出的RuntimeExcpetion異常,函數上可以不用聲明。

--------------

5如果函數聲明了異常,調用者需要進行處理。處理方法可以throws也可以try。

異常有兩種:

       編譯時被檢測異常

              該異常在編譯時,如果沒有處理(沒有抛也沒有try),編譯失敗。

              該異常被辨別,代表這可以被處理。

       運作時異常(編譯時不檢測)

              在編譯時,不需要處理,編譯器不檢查。

              該異常的發生,建議不處理,讓程式停止。需要對代碼進行修正。

------------

6:異常常用的處理語句:

<span style="font-size:18px;">try
{
	需要被檢測的代碼;
}
catch ()
{
	處理異常的代碼;
}
finally
{
	一定會執行的代碼;
}
</span>
           

        1,finally中定義的通常是 關閉資源代碼。因為資源必須釋放。

        2,finally隻有一種情況不會執行。當執行到System.exit(0);fianlly不會執行。

------------

7:異常的處理原則:

1,處理方式有兩種:try 或者 throws。

2,調用到抛出異常的功能時,抛出幾個,就處理幾個。

一個try對應多個catch。

3,多個catch,父類的catch放到最下面。

4,catch内,需要定義針對性的處理方式。不要簡單的定義printStackTrace,輸出語句。

也不要不寫。

當捕獲到的異常,本功能處理不了時,可以繼續在catch中抛出。

try

{

throw new AException();

}

catch (AException e)

{

throw e;

}

如果該異常處理不了,但并不屬于該功能出現的異常。

可以将異常轉換後,在抛出和該功能相關的異常。

或者異常可以處理,當需要将異常産生的和本功能相關的問題提供出去,

當調用者知道。并處理。也可以将捕獲異常處理後,轉換新的異常。

try

{

throw new AException();

}

catch (AException e)

{

// 對AException處理。

throw new BException();

}

異常的注意事項:

在子父類覆寫時:

1,子類抛出的異常必須是父類的異常的子類或者子集。

2,如果父類或者接口沒有異常抛出時,子類覆寫出現異常,隻能try不能抛。

-------------

8:自定義異常

1、定義一個類繼承Throwable或其子類。

2、添加構造方法(當然也可以不用添加,使用預設構造方法)。

3、在某個方法類抛出該異常。

4、捕捉該異常。

// 自定義異常執行個體
           
public class MyException extends Exception{  
    public MyException(){  
          
    }  
      
    public MyException(String message){  
        super(message);  
    }  
}  
  
  
public class Test {  
    public void display(int i) throws MyException{  
        if(i == 0){  
            throw new MyException("該值不能為0.......");  
        }  
        else{  
            System.out.println( i / 2);  
        }  
    }  
      
    public static void main(String[] args) {  
        Test test = new Test();  
        try {  
            test.display(0);  
            System.out.println("---------------------");  
        } catch (MyException e) {  
            e.printStackTrace();  
        }  
    }  
} 
           

------------

參考示例

/*
老師用電腦上課。

開始思考上課中出現的問題。
           
比如問題是
	電腦藍屏。
	電腦冒煙。

要對問題進行描述,封裝成對象。


可是當冒煙發生後,出現講課進度無法繼續。

出現了講師的問題:課時計劃無法完成。


*/

class LanPingException extends Exception
{
	LanPingException(String message)
	{
		super(message);
	}
}

class MaoYanException extends Exception
{
	MaoYanException(String message)
	{
		super(message);
	}
}


class NoPlanException extends Exception
{
	NoPlanException(String msg)
	{
		super(msg);
	}
}

class Computer
{
	private int state = 3;
	public void run()throws LanPingException,MaoYanException
	{
		if(state==2)
			throw new LanPingException("藍屏了");
		if(state==3)
			throw new MaoYanException("冒煙了");

		System.out.println("電腦運作");
	}
	public void reset()
	{
		state = 1;
		System.out.println("電腦重新開機");
		
	}
}

class Teacher
{
	private String name;
	private Computer cmpt;

	Teacher(String name)
	{
		this.name = name;
		cmpt = new Computer();

	}

	public void prelect()throws NoPlanException
	{
		try
		{
			cmpt.run();			
		}
		catch (LanPingException e)
		{
			cmpt.reset();
		}
		catch (MaoYanException e)
		{
			
			test();
			throw new NoPlanException("課時無法繼續"+e.getMessage());
			
		}
		System.out.println("講課");
	}
	public void test()
	{
		System.out.println("練習");
	}

}



class ExceptionTest 
{
	public static void main(String[] args) 
	{
		Teacher t = new Teacher("畢老師");
		try
		{
			t.prelect();
		}
		catch (NoPlanException e)
		{
			System.out.println(e.toString());
			System.out.println("換老師或者放假");
		}
		
	}
}