自定义异常
什么是自定义异常,为什么要自定义异常?
- 当java异常库中里面没有我想要去表达错误的问题异常,我就需要自己去定义一个异常来满足我们的需求,通过使用自己定义的异常来标记和处理某种错误情况
如何自定义异常?
- 自定义异常分为自定义运行时异常,和自定义非运行时异常,自定义运行时异常,需要继承自RuntimeException或者任意运行时异常的类,自定义非运行时异常,需要继承自Exception或者任意非运行时异常的类。
简单的代码示例
-
我们观察下面两份代码可以发现一个继承了exception,一个继承了RuntimeException,对于非运行时异常来说必须在方法上就标记这个异常,这样做是为了通知调用者必须处理或抛出这个异常。而对于运行时异常来说我们可以提前就采取方案来避免掉,不需要强制用try{}catch{}捕获处理
-
继承Exception的代码演示:
public static void main(String[] args) {
try {
throwCheckedException();
} catch (MyCheckedException e) {
System.out.println("捕获到非运行时异常:" + e.getMessage());
}
}
public static void throwCheckedException() throws MyCheckedException {
throw new MyCheckedException("这是一个非运行时异常");
}
public static class MyCheckedException extends Exception {
public MyCheckedException(String message) {
super(message);
}
}
- 继承RuntimeException的代码演示:
public static void main(String[] args) {
try {
throwRuntimeException();
} catch (MyRuntimeException e) {
System.out.println("捕获到运行时异常:" + e.getMessage());
}
}
public static void throwRuntimeException() {
throw new MyRuntimeException("这是一个运行时异常");
}
public static class MyRuntimeException extends RuntimeException {
public MyRuntimeException(String message) {
super(message);
}
}
一个小的demo演示
-
很简单,就是自定义了一个异常来处理年龄超出范围的情况,如果通过setAge 方法传入的年龄超出了范围,就会抛出 AgeOutOfBoundsException 异常,并有一个描述错的信息
-
AgeOutOfBoundsException类:
public class AgeOutOfBoundsException extends RuntimeException {
public AgeOutOfBoundsException(){
super();
}
public AgeOutOfBoundsException(String msg){
super(msg);
}
}
- Student类:
public class Student {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if (age < 0 || age > 130) {
throw new AgeOutOfBoundsException("年龄越界异常了,age:" + age);
}
this.age = age;
}
}
- 运行:
public static void main(String[] args) {
Student student = new Student();
student.setAge(131);
}
//输出:AgeOutOfBoundsException: 年龄越界异常了,age:131
再来一个稍微难一点的Demo
- 定义了一个自定义异常类InsufficientFundsException,表在取钱操作中余额不足的情况
public class InsufficientFundsException extends Exception {
//多余的钱
private double amount;
public InsufficientFundsException(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
public String getMessage() {
return "钱还差这么多:" + amount;
}
}
- 这是一个账户,功能有存钱,取钱和获取余额和卡号,在存钱的方法里就是将我存入的金额加到余额上面,取钱的方法是如果取款的金额小于等于余额时直接从余额中扣除就好,反之出现余额不足时则抛出自定义异常
public class Account {
private double balance;
private int number;
public Account(int number) {
this.number = number;
}
//存钱
public void deposit(double amount) {
balance += amount;
}
//取钱
public void withdraw(double amount) throws InsufficientFundsException {
if (amount <= balance) {
balance -= amount;
} else {
double needs = amount - balance;
throw new InsufficientFundsException(needs);
}
}
//返回余额
public double getBalance() {
return balance;
}
//返回卡号
public int getNumber() {
return number;
}
}
- 首先创建一个账户,卡号为10001,然后存进去了100,接着进行取钱,去了100,因为余额足够,所以取款成功,接着再取600,因为余额不足所以抛出InsufficientFundsException异常,并提示错误信息
public static void main(String[] args) {
Account c = new Account(10001);
System.out.println("存入100元");
c.deposit(100);
try {
System.out.println("取100元");
c.withdraw(100.00);
System.out.println("取600元");
c.withdraw(600.00);
} catch (InsufficientFundsException e) {
System.out.println("抱歉,你的余额不足 " + e.getMessage());
e.printStackTrace();
}
}
//错误信息:InsufficientFundsException: 钱还差这么多:600.0