【Java程式設計高階進階】如何使用自定義型別的異常?
阿新 • • 發佈:2019-02-03
異常的分類
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
應用類Servlet:SimpleServlet.javapackage 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); } }
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)