Java 自定义异常中非受检自定义异常怎么选
选择非受检自定义异常的核心在于判断该错误是否属于“业务逻辑可恢复”的范畴。如果程序在遇到特定输入或状态后,能够通过重试、降级或提示用户等方式继续正常运行,就应当抛出继承自 runtimeexception 的非受检异常;反之,若错误导致程序无法继续执行且必须强制终止,则应使用受检异常。在实际开发中,通常通过定义一个统一的基类来管理这些异常,并在具体业务场景中扩展它。

如何设计通用的非受检异常基类
设计通用基类的关键在于封装错误码和原始消息,以便上层统一处理。我们创建一个继承自 RuntimeException 的抽象基类 BaseNonCheckedException,它接受错误码和消息作为参数。这样,所有具体的业务异常都可以复用这个构造函数,保持代码的一致性。

public abstract class BaseNonCheckedException extends RuntimeException {
private final String errorCode;
public BaseNonCheckedException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public BaseNonCheckedException(String errorCode, String message, Throwable cause) {
super(message, cause);
this.errorCode = errorCode;
}
public String getErrorCode() {
return errorCode;
}
}
上述代码定义了一个基础的异常类,其中 errorCode 用于标识错误的类型,message 提供人类可读的描述。由于继承了 RuntimeException,调用者不需要强制捕获它,这符合非受检异常的设计初衷。
立即学习“Java免费学习笔记(深入)”;
具体业务异常的实现与使用场景
在具体业务中,我们需要创建具体的异常类,例如 InsufficientBalanceException(余额不足)和 InvalidInputException(输入无效)。这些异常都继承自 BaseNonCheckedException,并提供了特定的错误码。

public class InsufficientBalanceException extends BaseNonCheckedException {
public InsufficientBalanceException(double currentBalance, double requiredAmount) {
super("BAL_001", String.format("余额不足: 当前 %.2f, 需要 %.2f", currentBalance, requiredAmount));
}
}
public class InvalidInputException extends BaseNonCheckedException {
public InvalidInputException(String fieldName, String reason) {
super("INPUT_001", String.format("字段 %s 无效: %s", fieldName, reason));
}
}
在使用时,开发者可以直接抛出这些异常,而不必在方法签名中声明 throws。例如,在转账服务中,如果检测到余额不足,直接抛出 InsufficientBalanceException,调用方可以选择捕获它进行友好提示,或者让它向上抛出由全局异常处理器统一处理。
基于程序中某个输入、条件或结果的具体问题
当传入的余额为负数时,InsufficientBalanceException 会正确触发吗?是的,因为我们在构造异常消息时使用了格式化字符串,它会如实反映当前的余额值。无论余额是正数但小于所需金额,还是负数,只要不满足业务规则,就会抛出该异常。这种设计确保了异常信息的准确性,便于调试和日志记录。


















