Java基礎 快速學習(四)

路人暴脾氣發表於2017-06-09

注意:本系列部落格是在作者已經有一年多的C++經驗的基礎上學習Java的個人總結,可能並不適合所有看到這篇部落格的童鞋

異常機制


1.異常

Java的異常分為一下幾種

  1. 檢查性異常:最具代表的檢查性異常是使用者錯誤或問題引起的異常,這是程式設計師無法預見的。例如要開啟一個不存在檔案時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。
  2. 執行時異常: 執行時異常是可能被程式設計師避免的異常。與檢查性異常相反,執行時異常可以在編譯時被忽略。
  3. 錯誤: 錯誤不是異常,而是脫離程式設計師控制的問題。錯誤在程式碼中通常被忽略。例如,當棧溢位時,一個錯誤就發生了,它們在編譯也檢查不到的。

2.丟擲異常及捕獲異常

先看程式碼示例:

/*login.java*/
package exception1;

public class login
{
	String ac;
	String password;
	int code;
	
	public void setAc(String ac)
	{
		this.ac = ac;
	}

	public void setPassword(String password)
	{
		this.password = password;
	}

	public void setCode(int code)
	{
		this.code = code;
	}

	public int Loin() throws Exception  //使用throws宣告   
	{
		if (ac.length()>5)
		{
			throw new Exception("你輸入的使用者名稱太長了");    //丟擲異常
		}
		if (password.length()<8)
		{
			throw new Exception("密碼不可以小於8位");     //丟擲異常
		}
		
		System.out.println("登陸成功");
		return 0;
	}
}
/*my.java*/

package exception1;

public class my
{
	public static void main(String[] args)
	{
		login h = new login();
		h.setAc("cdd");
		h.setPassword("123");
		h.setCode(1235);

		try // 捕獲異常
		{
			h.Loin();
		} catch (Exception e) // 處理異常
		{
			System.out.println(e.getMessage());

			return;
		} finally    //該語句塊總是被呼叫執行     常用來作清理工作    
		{
			System.out.println("本次服務結束");
		}
		return;
	}
}
【1】所有的異常類是從 java.lang.Exception 類繼承的子類。

【2】使用 throws 關鍵字來宣告。throws 關鍵字放在方法簽名的尾部。使用 throw 關鍵字丟擲一個異常。

【3】使用 try 和 catch 關鍵字可以捕獲異常。語法如下:

try
{
   // 程式程式碼
}catch(ExceptionName e1)
{
   //Catch 塊
}
【4】finally 關鍵字用來建立在 try 程式碼塊後面執行的程式碼塊。無論是否發生異常,finally 程式碼塊中的程式碼總會被執行。在 finally 程式碼塊中,可以執行清理型別等收尾善後性質的語句。需要注意的是finally不執行的情況:JVM 過早終止(呼叫 System.exit(int));在 finally 塊中丟擲一個未處理的異常。

【5】 Throws丟擲異常的規則:
1) 如果是不可查異常(unchecked exception),即Error、RuntimeException或它們的子類,那麼可以不使用throws關鍵字來宣告要丟擲的異常,編譯仍能順利通過,但在執行時會被系統丟擲。

 2)必須宣告方法可丟擲的任何可查異常(checked exception)。即如果一個方法可能出現受可查異常,要麼用try-catch語句捕獲,要麼用throws子句宣告將它丟擲,否則會導致編譯錯誤

3)僅當丟擲了異常,該方法的呼叫者才必須處理或者重新丟擲該異常。當方法的呼叫者無力處理該異常的時候,應該繼續丟擲,而不是不處理。
4)呼叫方法必須遵循任何可查異常的處理和宣告規則。若覆蓋一個方法,則不能宣告與覆蓋方法不同的異常。宣告的任何異常必須是被覆蓋方法所宣告異常的同類或子類。

3.自定義異常與多重捕獲

使用者自定義異常類,只需繼承Exception類即可。看下面的示例程式碼:

/*Ac_Exception.java*/
package exception1;


public class Ac_Exception extends Exception
{
	public Ac_Exception(int id)
	{
		
		this.id=id;
	}
	private int id;
	@Override
	public String getMessage()
	{
		
		return "錯誤:賬戶輸入錯誤    ,錯誤程式碼 "+id;
	}
}
/*login。java*/
package exception1;

public class login
{
	String ac;
	String password;
	int code;
	
	public void setAc(String ac)
	{
		this.ac = ac;
	}

	public void setPassword(String password)
	{
		this.password = password;
	}

	public void setCode(int code)
	{
		this.code = code;
	}

	public int Loin() throws Exception,Ac_Exception  //使用throws宣告   
	{
		if (ac.length()>5)
		{
			throw new Ac_Exception(10);    //丟擲自定義異常
		}
		if (password.length()<8)
		{
			throw new Exception("密碼不可以小於8位");     //丟擲異常
		}
		
		System.out.println("登陸成功");
		return 0;
	}
}
/*my.java*/

package exception1;

public class my
{
	public static void main(String[] args)
	{
		login h = new login();
		h.setAc("cddasdas");
		h.setPassword("123");
		h.setCode(1235);

		try // 捕獲異常
		{
			h.Loin();
		} catch (Ac_Exception e)  //處理自定義異常
		{
			System.out.println(e.getMessage());
			
		} catch (Exception e) //因為自定義異常繼承與Exception 所以它放在最後邊,否則回直接攔截他後邊的異常
		{
			System.out.println(e.getMessage());
			
			return;
		} finally // 該語句塊總是被呼叫執行 常用來作清理工作
		{
			System.out.println("本次服務結束");
		}
		return;
	}
}

4.異常方法

1 public String getMessage()
返回關於發生的異常的詳細資訊。這個訊息在Throwable 類的建構函式中初始化了。


2 public Throwable getCause()
返回一個Throwable 物件代表異常原因。


3 public String toString()
使用getMessage()的結果返回類的串級名字。


4 public void printStackTrace()
列印toString()結果和棧層次到System.err,即錯誤輸出流。


5 public StackTraceElement [] getStackTrace()
返回一個包含堆疊層次的陣列。下標為0的元素代表棧頂,最後一個元素代表方法呼叫堆疊的棧底。


6 public Throwable fillInStackTrace()
用當前的呼叫棧層次填充Throwable 物件棧層次,新增到棧層次任何先前資訊中。


5.Java 內建異常類

  1、 java.lang.ArrayIndexOutOfBoundsException
    陣列索引越界異常。當對陣列的索引值為負數或大於等於陣列大小時丟擲。


   2、java.lang.ArithmeticException
    算術條件異常。譬如:整數除零等。


   3、java.lang.NullPointerException
   空指標異常。當應用試圖在要求使用物件的地方使用了null時,丟擲該異常。譬如:呼叫null物件的例項方法、訪問null物件的屬       性、計算null物件的長度、使用throw語句丟擲null等等



----------------------------------------------------------------
本系列文章:




相關文章