自定义异常类

Java内置了异常类Throwable,派生出Error类和Exception类

Exception

总体上我们根据Javac对异常的处理要求,将异常类分为2类。

非检查异常(unckecked exception):Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。

检查异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着。如SQLException , IOException,ClassNotFoundException 等。

而除了内置异常类,还可以自定义异常类

定义一个非检查异常类

package com.lihuia.exception;

/**
 * Copyright (C), 2018-2019
 * FileName: AgeException
 * Author:   lihui
 * Date:     2019/4/20
 */

public class AgeException extends RuntimeException {
    
    private static final long serialVersionUID = 1L;
    
    public AgeException() {
        super();
    }

    /**
     * 
     * @param message
     */
    public AgeException(String message) {
        super(message);
    }

    /**
     * 
     * @param message
     * @param cause
     */
    public AgeException(String message, Throwable cause) {
        super(message, cause);
    }

    /**
     * 
     * @param cause
     */
    public AgeException(Throwable cause) {
        super(cause);
    }
}

一般包含如下构造函数:

一个无参构造函数

一个带有String参数的构造函数,并传递给父类的构造函数

一个带有String参数和Throwable参数,并都传递给父类构造函数

一个带有Throwable 参数的构造函数,并传递给父类的构造函数

比如招聘,互联网公司只招聘不满35岁的人

package com.lihuia.exception;

import org.testng.annotations.Test;
import org.testng.collections.Maps;

import java.util.Map;

/**
 * Copyright (C), 2018-2019
 * FileName: AgeExceptionTest
 * Author:   lihui
 * Date:     2019/4/20
 */

public class AgeExceptionTest {
    
    public void age() {
        final Map<String, Integer> map = Maps.newHashMap();
        map.put("LiMing", 25);
        map.put("Lucy", 30);
        map.put("Lily", 35);
        map.put("Tom", 40);

        map.keySet().forEach(e -> {
            if (map.get(e) >= 35) {
                throw new AgeException(e + " " + map.get(e) +"岁,大于35岁不招聘");
            } else {
                System.out.println(e + " " + map.get(e) +"岁,小于35岁招聘");
            }
        });
    }

    @Test(description = "招聘要求")
    public void ageTest() {        
        try {
            age();
        } catch (AgeException e) {
            e.printStackTrace();
        }
    }
}

返回结果

com.lihuia.exception.AgeException: Tom 40岁,大于35岁不招聘
	at com.lihuia.exception.AgeExceptionTest.lambda$age$0(AgeExceptionTest.java:26)
	at java.util.HashMap$KeySet.forEach(HashMap.java:933)
	at com.lihuia.exception.AgeExceptionTest.age(AgeExceptionTest.java:24)
	at com.lihuia.exception.AgeExceptionTest.ageTest(AgeExceptionTest.java:36)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
	at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
	at org.testng.TestRunner.privateRun(TestRunner.java:648)
	at org.testng.TestRunner.run(TestRunner.java:505)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
	at org.testng.SuiteRunner.run(SuiteRunner.java:364)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
	at org.testng.TestNG.runSuites(TestNG.java:1049)
	at org.testng.TestNG.run(TestNG.java:1017)
	at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
	at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

调用一个参数的构造函数

/**
 * 
 * @param message
 */
public AgeException(String message) {
    super(message);
}

继承RuntimeException

发表评论