在Java中,自定义异常类可以让你更精确地表达程序中可能发生的特定错误情况。自定义异常通常用于业务逻辑错误,其中Java标准异常类无法充分描述发生的异常情况。自定义异常通过继承Java的异常类(Exception
或RuntimeException
)来实现。
自定义检查型异常(Checked Exception)
检查型异常必须在方法的签名中声明,并且调用这个方法的代码必须处理这个异常,要么通过try-catch
块捕获它,要么通过throws
关键字在方法签名中声明继续向上抛出。
public class CustomCheckedException extends Exception {
public CustomCheckedException() {
super();
}
public CustomCheckedException(String message) {
super(message);
}
public CustomCheckedException(String message, Throwable cause) {
super(message, cause);
}
public CustomCheckedException(Throwable cause) {
super(cause);
}
}
使用自定义检查型异常:
public void doSomething() throws CustomCheckedException {
// 业务逻辑代码
throw new CustomCheckedException("发生了一个错误");
}
自定义非检查型异常(Unchecked Exception)
非检查型异常(也称为运行时异常)不需要显式地在方法签名中声明,也不要求调用者处理这些异常。它们通常表示程序中的逻辑错误。
public class CustomUncheckedException extends RuntimeException {
public CustomUncheckedException() {
super();
}
public CustomUncheckedException(String message) {
super(message);
}
public CustomUncheckedException(String message, Throwable cause) {
super(message, cause);
}
public CustomUncheckedException(Throwable cause) {
super(cause);
}
}
使用自定义非检查型异常:
public void doSomething() {
// 业务逻辑代码
throw new CustomUncheckedException("发生了一个逻辑错误");
}
实践教程
-
定义自定义异常类:根据你的业务需求,决定继承
Exception
还是RuntimeException
。如果希望调用者强制处理异常,则选择Exception
;如果异常由程序员错误导致,则选择RuntimeException
。 -
添加构造函数:在自定义异常类中,添加不同的构造函数。最起码,你应该包含一个无参构造函数和一个带有详细错误信息的字符串参数的构造函数。
-
在适当的地方抛出异常:在你的业务逻辑中,当遇到需要用到自定义异常的场景时,使用
throw
关键字抛出自定义异常实例。 -
处理异常:如果你定义了一个检查型异常,确保在调用该异常的地方使用
try-catch
块来捕获和处理异常,或者在方法签名中用throws
关键字声明该异常。
示例:自定义异常实践
public class BankAccount {
private double balance;
// 构造函数
public BankAccount(double balance) {
this.balance = balance;
}
// 取款方法,当余额不足时抛出自定义检查型异常
public void withdraw(double amount) throws InsufficientFundsException {
if (amount > balance) {
throw new InsufficientFundsException("余额不足");
}
balance -= amount;
}
// 自定义检查型异常
public static class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}
public static void main(String[] args) {
BankAccount account = new BankAccount(100);
try {
account.withdraw(200);
} catch (InsufficientFundsException e) {
e.printStackTrace();
}
}
}
在上述示例中,我们定义了一个BankAccount
类,该类中的withdraw
方法在余额不足时会抛出自定义的检查型异常InsufficientFundsException
。这里展示了如何在业务逻辑中使用自定义异常来