7.2 自定义异常
Java 内置异常可以处理很多通用错误,但真实项目经常会遇到业务规则错误。例如“库存不足”不是 Java 语法错误,也不是类型错误,而是业务规则被违反。
定义异常类
自定义异常(custom exception)经常继承 Exception。在 Java 中,自定义异常类通常会用 super(message) 把错误信息交给父类构造方法。
java
class OutOfStockException extends Exception {
OutOfStockException(String message) {
super(message);
}
}异常信息可以在 throw 时传入:
java
throw new OutOfStockException("笔记本库存不足。");自定义异常的名字应该清楚表达错误含义。OutOfStockException 比普通的 Exception 更具体,也更容易被调用者识别。
正在加载概念检查...
库存案例
正在加载交互实验...
java
class OutOfStockException extends Exception {
OutOfStockException(String message) {
super(message);
}
}
class Product {
String name;
int stock;
Product(String name, int stock) {
this.name = name;
this.stock = stock;
}
void purchase(int quantity) throws OutOfStockException {
if (quantity <= 0) {
throw new IllegalArgumentException("购买数量必须大于 0。");
}
if (quantity > stock) {
throw new OutOfStockException(name + "库存不足。");
}
stock -= quantity;
}
}
public class StockDemo {
public static void main(String[] args) {
Product product = new Product("笔记本", 5);
try {
product.purchase(3);
System.out.println("购买成功,剩余库存:" + product.stock);
product.purchase(4);
} catch (OutOfStockException error) {
System.out.println("购买失败:" + error.getMessage());
}
}
}运行结果:
text
购买成功,剩余库存:2
购买失败:笔记本库存不足。这个例子里,IllegalArgumentException 表示参数本身不合理,OutOfStockException 表示业务规则不允许继续购买。不同异常表达不同问题,调用者才能做出更准确的处理。
正在加载概念检查...
为什么要自定义异常
自定义异常的价值不只是“能抛出错误”,而是让错误更有语义(semantics)。
当调用者捕获 OutOfStockException 时,它很清楚这是库存问题,可以显示“补货”或“换商品”等业务操作;而捕获 IllegalArgumentException 时,它更可能提示用户修改输入数量。
正在加载概念检查...
正在加载本节练习...