Java自定義Exception

這裏總結一下Java的Exception,並實現一個自定義Exception類。 html

總結: java

  1. Throwable對象分爲兩種類型:Error(表示編譯時和系統錯誤);Exception(在Java類庫、用戶方法以及運行時故障中拋出的異常)。
  2. Exception細分紅兩種異常:受檢查異常(如,IOException, SQLException等。在編譯時要被強制檢查的異常,須要用try, catch, finally關鍵字在編譯時期處理,不然會報錯。);運行時異常(ArithmeticException, ClassCastException, IllegalArgumentException, IndexOutOfBoundsException, NullPointerException等。編譯器不會檢查這類異常。)
  3. Java編程中處理異常的最佳實踐[4]:
    • 爲可恢復的錯誤使用檢查型異常,爲編程錯誤使用非檢查型錯誤。
    • 在finally程序塊中關閉或者釋放資源
    • 在堆棧跟蹤中包含引發異常的緣由
    • 始終提供關於異常的有意義的完整的信
    • 避免過分使用檢查型異常
    • 將檢查型異常轉爲運行時異常
    • 記住對性能而言,異常代價高昂
    • 避免catch塊爲空
    • 使用標準異常
    • 記錄任何方法拋出的異常
  4. 受檢查異常和運行時異常的區別:
    • 受檢查異常須要自行處理,運行時異常不須要
    • 受檢查異常是Exception直接子類,運行時異常是RuntimeException的子類
    • 受檢查異常可能是編程時出現的錯誤,運行時異常是程序運行時故障率較高
  5. 避免出現NullPointerException的最佳實踐[5]:
    • 用已知的字符串對象調用equals()和equalsIgnoreCase()方法【"hello".equals(objString)】;
    • 若是valueOf()和toString()方法的返回值同樣的話,用valueOf()方法代替toString()方法【當爲null的對象調用toString()方法時會拋出NullPointerException異常而調用valueOf()方法時會返回一個"null"的封裝類】;
    • 使用對null安全的方法和庫【eg, StringUtils.isBlank(), isNumeric(), isWhiteSpace()等】;
    • 方法調用的返回值用返回空的集合或者空的數組避免返回null的狀況【Collections.EMPTY_LIST, Collections.EMPTY_SET和Collections.EMPTY_MAP等】;
    • 使用@NotNull和@Nullable的註解明確指出是否可能有null的狀況出現;
    • 避免代碼中出現沒必要要的自動裝箱和拆箱【避免相似的int a 出現接收返回值爲null的狀況,用Integer a代替更好】;
    • 遵照契約而且使用合理的默認值【經過定義什麼能夠爲空,什麼不能爲空,主叫方能夠明確的做出判斷。】;
    • 在使用數據庫存儲對象時,要定義是否容許某個字段爲空,這樣數據庫自身機制能夠檢查是否爲空的狀況,避免程序調用後出現非法的空字段。
    • 使用null的封裝對象Null類。

自定義一個Exception類: 數據庫

ProjectNameException.java 內容以下: 編程

package com.trianlge23.projectname.exception;

public class ProjectNameException extends Throwable {

	private static final long serialVersionUID = 8093803025939797139L;
	//exception code
	private int exceptionCode;
	//exception detailed message
	private String detailMsg;

	public ProjectNameException(int exceptionCode, String extraMsg) {
		super();
		this.setDetailMsg(exceptionCode);
		this.setExtraMsg(extraMsg);
	}

	public ProjectNameException(int exceptionCode) {
		super();
		this.setDetailMsg(exceptionCode);
	}

	//notice: we do not offer the set method to set the excption code.
	public int getExceptionCode() {
		return exceptionCode;
	}

	//if there has no extra message for this excption code, init it.
	private void setDetailMsg(int exceptionCode) {
		this.exceptionCode = exceptionCode;
		if (ProjectNameExceptionCode.EXCEPTION_CODE_MAP
				.containsKey(exceptionCode)) {
			this.detailMsg = ProjectNameExceptionCode.EXCEPTION_CODE_MAP
					.get(exceptionCode);
		} else {
			this.detailMsg = ProjectNameExceptionCode.EXCEPTION_CODE_MAP
					.get(ProjectNameExceptionCode.PROJECTNAME_EXCEPTION_CODE_NOT_FOUND);
		}
	}

	//if there has extra message for this exception code, add it.
	private void setExtraMsg(String extraMsg) {
		this.detailMsg += ProjectNameExceptionCode.EXTRA_EXCEPTION_MSG_SPLITER
				+ extraMsg;
	}

	//override the super class method getMessage()
	@Override
	public String getMessage() {
		return this.detailMsg;
	}
}


ProjectNameExceptionCode.java內容以下:
package com.triangle23.projectname.exception;

import java.util.HashMap;
import java.util.Map;

public class ProjectNameExceptionCode {
	//the separator between default message and extra message of exception.
	public static final String EXTRA_EXCEPTION_MSG_SPLITER = ": ";
	//the map stores the exception code and exception message
	public static Map<Integer, String> EXCEPTION_CODE_MAP;
	public static final int PROJECTNAME_EXCEPTION_CODE_NOT_FOUND = 1;

	static {
		EXCEPTION_CODE_MAP = new HashMap<Integer, String>();
		EXCEPTION_CODE_MAP.put(PROJECTNAME_EXCEPTION_CODE_NOT_FOUND,
				"[PROJECTNAME Exception] Not found exception code.");

	}
}



參考資料: api

1. JDK1.7 API:http://docs.oracle.com/javase/7/docs/api/ 數組

2. Java編程思想(第四版) 安全

3. Effective Java oracle

4. Exception Handling Java Best Practices: 
http://javarevisited.blogspot.com/2013/03/0-exception-handling-best-practices-in-Java-Programming.html
app

5. Java Tips and Best practices to avoid NullPointerException: 
http://javarevisited.blogspot.com/2013/05/java-tips-and-best-practices-to-avoid-nullpointerexception-program-application.html
ide


說明:

若有錯誤還請各位指正,歡迎你們一塊兒討論給出指導。

最後更新時間:2014-12-02

相關文章
相關標籤/搜索