Java内置了异常类Throwable,派生出Error类和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