天天看點

Java源碼學習02-異常的定義,使用,處理

異常的頂層父類Throwable:繼承它後,檢視内部的方法.包括

​
package learn.error;

import java.io.Serializable;
import java.util.Objects;

/**
 * Throwable異常處理頂層父類:繼承該類的有Error編譯異常,Exception運作時異常. <br>
 * 方法會操作堆棧.我們這裡繼承Throwable,介紹Throwable中的方法
 * 
 * @author Administrator
 *
 */
public class MyThrowable extends Throwable implements Serializable {
	private static final long serialVersionUID = 1L;
	/** 異常的詳細資訊 */
	private String detailMessage = "詳細資訊";
	/** 異常的原因 */
	private Throwable cause = this;

	/**
	 * 擷取異常的詳細資訊
	 */
	@Override
	public String getMessage() {
		return detailMessage;
	}

	/**
	 * 擷取本地化消息
	 */
	@Override
	public String getLocalizedMessage() {
		return getMessage();
	}

	/**
	 * 擷取異常原因
	 */
	@Override
	public synchronized Throwable getCause() {
		return (cause == this ? null : cause);
	}

	/**
	 * 初始化異常原因
	 */
	@Override
	public synchronized Throwable initCause(Throwable cause) {
		if (this.cause != this)
			throw new IllegalStateException("無法覆寫原因 " + Objects.toString(cause, "為null"), this);
		if (cause == this)
			throw new IllegalArgumentException("不允許自相沖突", this);
		this.cause = cause;
		return this;
	}

	@Override
	public String toString() {
		String s = getClass().getName();
		String message = getLocalizedMessage();
		return (message != null) ? (s + ": " + message) : s;
	}

	/**
	 * System.err列印錯誤資訊
	 */
	@Override
	public void printStackTrace() {
		printStackTrace(System.err);
	}

	// 其他一些操作堆棧的方法就不顯示了
}

​
           

而Error中都是一些無參有參構造函數.

public MyError() {
		super();
	}

	public MyError(String message) {
		super(message);
	}

	public MyError(String message, Throwable cause) {
		super(message, cause);
	}

	public MyError(Throwable cause) {
		super(cause);
	}

	protected MyError(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
	}
}


public class MyException extends Exception {
	static final long serialVersionUID = -3387516993124229948L;

	public MyException() {
		super();
	}

	public MyException(String message) {
		super(message);
	}

	public MyException(String message, Throwable cause) {
		super(message, cause);
	}

	public MyException(Throwable cause) {
		super(cause);
	}

}
           

而繼承這兩類編譯異常,運作時異常的下級異常類,基本都是調用這兩個類裡的方法來輸出異常資訊或自定義資訊.目的是調用最頂層Throwable來操作堆棧和列印輸出異常資訊.

而Error和Exception類下面的不同子類也是為了區分不同的異常類型與列印資訊,便于程式設計開發人員能快速定位異常出現的原因.

以上概念了解了就可以定義自己的異常處理類來處理異常了.

你可以根據Exception類中的方法仿照這寫一個自己的異常類需要 繼承 Exception. 我上面的就是自定義的異常類.當使用時将處理異常的類選中自定義的即可.           eg:      throw  new   MyException("XXX出錯了!");

對異常的處理通常有兩種方法 try catch 捕獲或者  throw 一個異常類往上抛出

try {
	throw new IllegalAccessError("調用已有異常類并抛出異常");
} catch (Exception e) {
	e.printStackTrace();
	System.out.println("try catch異常列印處理或列印到日志log中,或調用自己的異常處理類都需");
} finally {

}
           

繼續閱讀