1. 程式人生 > >Java自定義異常理解

Java自定義異常理解

前言:看了許多部落格和書,都對自定異常一筆帶過,總讓人感覺莫名奇妙,一直在問自己一個問題,我們能很好的解決異常就很不錯了,為什麼還要自己自定義異常,讓自己去自找麻煩呢?後來我才理解自定義異常有自己的妙用。

Java錯誤與異常的基本概念:

1.java中異常均繼承自Throwable,其有兩個重要的直接子類error與exception.

2.java錯誤error,大部分是由虛擬機器爆出來的錯誤,是程式無法處理的錯誤,如OutOfMemoryError,當JVM需要更多記憶體空間而得不到滿足時,就會爆出OutOfMemoryError

3.Exception,異常,其下分類很多,如可查異常與不可查異常,執行時異常與非執行時異常,基本概念一樣,只是說法不同罷了。其有個重要的子類即RuntimeException執行時異常,其它直接子類都歸為非RuntimeException

,如IOException,SQLException等。

       a.非RuntimeException是在程式碼書寫時,編譯器給你檢查提示你要進行try catch或throws處理。

       b.RuntimeException,編譯器不會幫你自動檢查,當你執行程式時,虛擬機器才會給你爆出錯誤讓你去處理,這個往往是我們編碼邏輯或不規範導致的

下面我們來看看java異常類結構層次圖:


異常中的try,catch,throw,throws,finally,相信都能很好理解,下面我重點來說自定義異常了。

JAVA自定義異常:

自定義異常幾步驟:

1.自定義一個類,整合自Exception

2.重寫父類Exception所有的公共方法

3.過載建構函式

那為什麼要自定義異常呢,這就涉及到專案結構中的分層思想了,根據MVC架構,一個專案可大體分為3個層次,

1.是模型層model,這個往往與資料庫中的表結構相對應,今天內容不涉及該層可忽略。

2.是業務邏輯層Contorler,往往處理的是業務邏輯的,如對資料庫的增刪改查,業務邏輯的判斷等。

3.是介面層view,是與使用者互動的層次,往往只用於重新整理顯示介面

這些層次都有自己的使命,view層不能又進行業務邏輯的處理又進行介面顯示重新整理的操作,這樣管理維護程式碼就清晰多了,那麼隨之問題就來了,但我業務邏輯層做了邏輯判斷之後想要view層根據不同的業務進行ui顯示時又該怎麼做呢?這個就需要我們自定義異常類登場了。我們以簡單密碼校驗為例:

我們只對密碼進行校驗,當登入時如果密碼為123提示登入成功,否則提示失敗

import java.util.Scanner;

public class Login {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String pw = scan.nextLine();
		if ("123".equals(pw)) {
			System.out.println("登入成功");
		}else{
			System.out.println("登入失敗");
		}

	}

}

這個是很直接的寫法,邏輯判斷與介面重新整理顯示都在view層去處理了,這種寫法不是我們想要的,等到我們專案變大後你會發現view層做介面顯示又做邏輯處理是多麼的愚蠢。

下面我們用分層思想去實現該功能。

1.我們先自定義異常類 MyException

import java.io.PrintStream;
import java.io.PrintWriter;

@SuppressWarnings("serial")
public class MyException extends Exception{
	/**
	 * 過載建構函式
	 */
	public MyException() {
		super();
	}

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

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

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

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

	/**
	 * 重寫父類的方法
	 */
	
	@Override
	public String getMessage() {
		// TODO Auto-generated method stub
		return super.getMessage();
	}
	
	@Override
	public String getLocalizedMessage() {
		// TODO Auto-generated method stub
		return super.getLocalizedMessage();
	}

	@Override
	public synchronized Throwable getCause() {
		// TODO Auto-generated method stub
		return super.getCause();
	}

	@Override
	public synchronized Throwable initCause(Throwable cause) {
		// TODO Auto-generated method stub
		return super.initCause(cause);
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return super.toString();
	}

	@Override
	public void printStackTrace() {
		// TODO Auto-generated method stub
		super.printStackTrace();
	}

	@Override
	public void printStackTrace(PrintStream s) {
		// TODO Auto-generated method stub
		super.printStackTrace(s);
	}

	@Override
	public void printStackTrace(PrintWriter s) {
		// TODO Auto-generated method stub
		super.printStackTrace(s);
	}

	@Override
	public synchronized Throwable fillInStackTrace() {
		// TODO Auto-generated method stub
		return super.fillInStackTrace();
	}

	@Override
	public StackTraceElement[] getStackTrace() {
		// TODO Auto-generated method stub
		return super.getStackTrace();
	}

	@Override
	public void setStackTrace(StackTraceElement[] stackTrace) {
		// TODO Auto-generated method stub
		super.setStackTrace(stackTrace);
	}

	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return super.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		return super.equals(obj);
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}

	@Override
	protected void finalize() throws Throwable {
		// TODO Auto-generated method stub
		super.finalize();
	}

	

}

然後寫我的業務邏輯層LoginService

public class LoginService {
	//這裡不能講exception try catch ,將它丟擲去讓view層去捕獲,再進行處理
	public void vertifyPw(String pw) throws MyException{
		if ("123".equals(pw)) {
			throw new MyException("登入成功");
		}else{
			throw new MyException("登入失敗");
		}
	}

}

最後重新整理view
import java.util.Scanner;

public class Login {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String pw = scan.nextLine();
		LoginService ls = new LoginService();
		// 這裡呼叫vertifyPw(),方法進行校驗,根據不同的返回值做列印輸出e.getMessage();
		try {
			ls.vertifyPw(pw);
		} catch (MyException e) {
			System.out.println(e.getMessage());
		}

	}

}

我在註釋中已對關鍵地方做了註解,看程式碼應該很容易能理解到自定義異常的好處了吧!

結語:不要嘆氣,你現在走的每一步都是為你昨天的選擇買單,換句話說,這也叫擔當!

相關推薦

Java定義異常理解

前言:看了許多部落格和書,都對自定異常一筆帶過,總讓人感覺莫名奇妙,一直在問自己一個問題,我們能很好的解決異常就很不錯了,為什麼還要自己自定義異常,讓自己去自找麻煩呢?後來我才理解自定義異常有自己的妙用。 Java錯誤與異常的基本概念: 1.java中異常均繼承自Throw

Java定義異常

trace tex logs fin rate cat java自定義異常 leg pan package cn.Douzi.Lab7_4; public class Triangle { int a, b, c; publ

java定義異常以及throw和throws關鍵字

java中內建了很多可能在程式設計時出現的大部分異常。除此之外,使用者可以使用一個類繼承Exception類即可繼承自定義類異常。 在程式中自定義類,大體上分為以下幾個步驟: 建立自定義異常類 在方法中通過throw關鍵字丟擲異常物件。 如果在當前丟擲異常的方法中處理異常,

java定義異常(列舉)

public class SimpleException extends RuntimeException { private String msg ; private StatusCode statusCode ; public SimpleEx

java定義異常處理類

/*** * 為什麼使用自定義異常? * 更加精確定位具體異常資訊 * * 繼承RuntimeException,實現RuntimeException的所有構造方法,就是一種自定義異常類 * */ public class ServiceException extends Runti

Java定義異常異常使用最佳實踐

異常的分類 1. 非執行時異常(Checked Exception)         Java中凡是繼承自Exception但不是繼承自RuntimeException的類都是非執行時異常。 2. 執行時異常(Runtime Exception/Unchecked Exce

摘自《java 2 實用教程》 java定義異常

class BankException extends Exception { String message; public BankException(int m, int n) { message = "入賬資金" + m + "是負數或者支出" + n +

Java定義異常(優雅的處理異常)

(本文較長,精華部分直接下拉)在複雜業務環境下,java自帶的異常可能滿足不了我們業務的需求, 這個時候我們可以自定義異常來進行對業務異常的處理;首先,我們先對異常進行基本的解釋:Throwable是所有Java程式中錯誤處理的父類 ,有兩種子類:Error和Exceptio

深入java 定義異常以及常用

上一篇文章總結了java的異常用法,常見得java異常以及例子說明。這一篇文章我們繼續深入,瞭解自定義java異常以及常用的異常記錄工具。更多的原始碼請訪問我的github:https://github.com/yangsheng20080808/deepIntoJava

java定義異常類以及全域性log列印

import lombok.Data; /** * @author 01369526 * */ @Data @SuppressWarnings("serial") public class MyException extends RuntimeExcep

java定義異常(runtimeException)

                    Throwable                      /                \              Error             Exception /                   /      

java定義異常

簡單介紹一下java中自定義異常類的使用 背景:這裡我簡單模擬登陸操作,檢測到密碼不正確則丟擲異常 自定義異常類的使用步驟如下: 1、自定義異常類繼承Exception類 /** * 自定義異常類 */ public class MyExcept

Java 定義異常

/*  * 自定義異常類  * sun提供了很多的異常類給我們用於描述程式中各種的不正常情況,但是sun給我提

java基礎--定義異常使用練習

heron dex oat try ssa color epo 原因 str 個人認為首先要知道兩點: 1.異常的父類為 Throwable 2.錯誤、異常總共分為三類,但需要程序處理的只有一種 現在寫一個小例子: 需求:敵我雙方各自英雄進行攻擊,如果某方生命值達到0

java中如何創建定義異常Create Custom Exception

公司 最好 static content turn 而且 否則 系統 tms 9.創建自定義異常 Create Custom Exception (視頻下載) (全部書籍) 馬克-to-win:我們可以創建自己的異常:checked或unchecked異常都可以, 規則如

Java IO流中的異常處理以及定義異常例項

文章目錄 異常 自定義異常例項 finally中特殊情況例項 異常 1、 Throwable類  a) 嚴重問題:Error,比如說記憶體不夠,一般程式中不進

JAVA基礎 - 定義異常

自定義異常類,程式碼還不是很明白,先存著以後參考。 package week6; class ScoreException extends Exception { private static final long serialVersionUID = 1L; publi

java實現定義異常例項程式碼

此處主要便於對異常類的使用上方便大家理解以一個公約數為例做了一個簡單自定義異常的處理程式碼如下: 如果操作者輸入數字符合要求程式執行,不符合則丟擲錯誤。 package 自定義異常簡單例項; import java.util.Scanner; public class CommonDivisor

設計一個 Java 程式,定義異常類,從命令列(鍵盤)輸入一個字串,如果該字串值為“XYZ”。。。

設計一個 Java 程式,自定義異常類,從命令列(鍵盤)輸入一個字串,如果該字串值為“XYZ”,則丟擲一個異常資訊“This is a XYZ”,如果從命令列輸入 ABC,則沒有丟擲異常。(只有 XYZ 和 ABC 兩種輸入)。 class xyz {   public void test(S

Java-丟擲異常定義異常

異常處理常用方法: 常用的異常處理方法有: 一、try()catch() 語句 二、throw / throws 語句 三、自定義異常類 用途: 眾所周知,當程式執行過程中,如果遇到了錯誤(比如陣列下標越界,空指標等)程式就會自動終止,但這種錯誤一般是偶然的,可能是使用者