1. 程式人生 > >【Java程式設計高階進階】如何使用自定義型別的異常?

【Java程式設計高階進階】如何使用自定義型別的異常?

異常的分類

1. 非執行時異常(Checked Exception)
Java中凡是繼承自Exception但不是繼承自RuntimeException的類都是非執行時異常。
2. 執行時異常(Runtime Exception/Unchecked Exception)
RuntimeException類直接繼承自Exception類,稱為執行時異常。Java中所有的執行時異常都直接或間接的繼承自RuntimeException。
Java中所有的異常類都直接或間接的繼承自Exception。

異常的處理

一、對應非執行時異常,必須對其進行處理。處理方式有兩種:
使用try…catch…finally語句塊進行捕獲
在產生異常的方法所在的方法宣告throws Exception
二、對於執行時異常,可以不對其進行處理,也可以對其進行處理。一般情況下都不對其進行處理。
在使用Java API的方法時會產生異常,由於實際的需要,我們需要建立和使用自定義異常。使用全新的異常類,應用到系統程式中。

為什麼使用自定義型別的異常

其實這是問題處理的模式/方式之一;

其它的是什麼?例如WindowsAPI的GetLastError,swift、Go的多返回值 ,返回一個實體類包含所有需要的資訊;

而這個方法同樣也有多種應用。

應用一:你的一個方法中把一些必須滿足的條件作為異常來處理;

應用二:你的一個方法中把所有可能遇到的異常都捕獲了,附加上其它資訊丟擲新的異常;

應用三:以上兩種混合應用;

應用例項

自定義異常類:CustomException.java

package wasdev.sample.servlet;

/**
 * 自定義異常
 * @author testcs_dn
 * 
 */
public class CustomException extends Exception {

	private static final long serialVersionUID = -3260180827302646043L;
	/**
	 * 擴充套件資訊
	 */
	private String exMsg;
	public String getExMsg() {
		return exMsg;
	}

	public void setExMsg(String exMsg) {
		this.exMsg = exMsg;
	}

	/**
	 * 
	 */
	public CustomException() {
		super();
	}

	public CustomException(String msg) {
		super(msg);
	}

	/**
	 * 
	 * @param msg 異常資訊
	 * @param exMsg 擴充套件資訊
	 */
	public CustomException(String msg, String exMsg) {
		super(msg);
		this.setExMsg(exMsg);
	}
}
應用類Servlet:SimpleServlet.java
package wasdev.sample.servlet;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class SimpleServlet
 */
@WebServlet("/SimpleServlet")
public class SimpleServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.getWriter().print("Hello World!");
        
        try {
			doSomething();
		} catch (CustomException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
        try {
			doSomething("user", "pwd");
		} catch (CustomException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    
    protected void doSomething() throws CustomException{
    	throw new CustomException("abcd");
    	
    }
    
    protected void doSomething(String userName, String password) throws CustomException{
    	if (userName == null || userName.length() == 0){
    		throw new CustomException("abcd", "userName");
    	}
    	
    	if (password == null || password.length() == 0){
    		throw new CustomException("abcd", "password");
    	}
    	
    	File f = new File("test.txt");
    	if (f.exists()){
    		try {
				FileOutputStream fos = new FileOutputStream(f);
				try {
					fos.close();
				} catch (IOException e) {
					throw new CustomException("abcd", "IOException");
				}
			} catch (FileNotFoundException e) {
				throw new CustomException("abcd", "FileNotFoundException");
			}
    		
    	}
    }

    protected void doSomething2(){
    	try {
    		throw new CustomException("abcd", "擴充套件資訊");
		} catch (CustomException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
}

結束語

這裡只是演示自定義異常的使用方式,不要糾結演示程式碼的業務合理性,

如果你有更好的應用場景歡迎分享!

我這裡只定義了一個異常類:CustomException,你也可以做如下定義,只要你喜歡:

UserNameException,PasswordException,FileWriteException……等等。

===========文件資訊============ 

署名(BY) :testcs_dn(微wx笑) 
文章出處:[無知人生,記錄點滴](http://blog.csdn.net/testcs_dn)