3.自定义异常
在 Java 中,我们可以通过定义自己的异常类来表示特定的错误情况和处理方式。自定义异常类通常包含以下内容:
- 定义异常类,并继承 Exception 或者
RunTimeException
。 - 编写异常类的构造方法,向父类构造方法传入异常描述信息,并继承父类的其他实现方法。
- 实例化自定义异常对象,并在程序中使用 throw 抛出。
public class Throw {
public static void main(String[] args) {
BoyFirend boyFirend = new BoyFirend();
try{
boyFirend.setName("甜甜");
boyFirend.setAge(80);
}catch (AgeException a){
a.printStackTrace();
}
}
}
class BoyFirend{
private String name;
private String gender;
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) throws AgeException {
if(age > 0 && age <18){
this.age = age;
}
else{
throw new AgeException("输入正确的年龄");
}
}
class AgeException extends Exception{
public AgeException(String messgae){
super(messgae);
}
}
自定义异常可能是编译时异常,也可以是运行时异常。
-
如果自定义异常类继承
Excpetion
,则是编译时异常。特点:方法中抛出的是编译时异常,必须在方法上使用throws声明,强制调用者处理。
-
如果自定义异常类继承
RuntimeException
,则运行时异常。特点:方法中抛出的是运行时异常,不需要在方法上用throws声明。
4.异常链
将一个异常作为另一个异常的原因而被抛出。通过异常链,我们可以更清晰地了解异常的触发原因,并且可以在捕获异常时获取到完整的异常信息。
在创建异常链时,可以使用以下两种方式之一:
- 直接在新抛出的异常中添加原来的异常信息
throw new Exception("我是新产生的异常1", e);
示例:
public static void main(String[] args) {
try {
testThree();
} catch (Exception e) {
e.printStackTrace(); //
}
}
public static void testOne() throws MyException1 {
throw new MyException1("我是一个异常");
}
public static void testTwo() throws Exception {
try {
testOne();
} catch (Exception e) {
throw new Exception("我是新产生的异常1",e);
}
}
public static void testThree() throws Exception {
try {
testTwo();
} catch (Exception e1) {
throw new Exception("我是新产生的异常2",e1);
}
}
}
class MyException1 extends Exception {
public MyException1(String message) {
super(message);
}
}
- 在要抛出的对象中使⽤
initCause()
⽅法,添加上⼀个产⽣异常的信息;getCause()
可以获取当前异常对象的上⼀个异常对象
Exception e2 = new Exception("我是新产生的异常2");
e2.initCause(e);
throw e2;
示例:
public static void main(String[] args) {
try {
testThree();
} catch (Exception e) {
e.printStackTrace(); //
}
}
public static void testOne() throws MyException {
Exception e1 = new Exception("我是新产生的异常");
}
public static void testTwo() throws Exception {
try {
testOne();
} catch (Exception e1) {
Exception e2 = new Exception("我是新产生的异常1");
e2.initCause(e2);
throw e2;
}
}
public static void testThree() throws Exception {
try {
testTwo();
} catch (Exception e2) {;
Exception e3 = new Exception("我是新产生的异常2");
e3.initCause(e3);
throw e3;
}
}
}
class MyException extends Exception{
public MyException(String message){
super(message);
}
}