【大白话说Java面试题】【Java基础篇】第36题:自定义异常在生产环境中如何应用?

0 阅读2分钟

📌 专栏:大白话说Java面试题 — 01-Java基础篇

第36题:自定义异常在生产环境中如何应用

📚 回答:

  • 核心概念
    Java 提供了许多内置异常类(如 NullPointerExceptionIOException 等),用于处理常见的错误场景。但在实际开发中,业务逻辑往往比语法层面的错误更复杂,这时就需要使用自定义异常来处理特定的业务错误。

1. 自定义异常的作用
  • 弥补内置异常的不足

    • 内置异常通常针对语法或系统级别的错误,而业务逻辑中的错误需要更具体的描述。
    • 示例:用户注册时,用户名已存在是一个业务错误,无法用内置异常准确描述。
  • 提高代码可读性与维护性

    • 使用自定义异常可以为特定业务场景提供明确的错误信息,便于开发者快速定位问题。

2. 如何实现自定义异常?
  • 步骤

    1. 定义一个继承自 ExceptionRuntimeException 的类。
      • 继承 Exception:表示受检异常(Checked Exception),调用者必须显式处理。
      • 继承 RuntimeException:表示非受检异常(Unchecked Exception),调用者可以选择性处理。
    2. 添加构造方法,用于传递错误信息。

    💡 代码示例
    以下代码展示了自定义异常的基本实现:

// 自定义受检异常
class UserNameAlreadyExistsException extends Exception {
    public UserNameAlreadyExistsException(String message) {
        super(message);
    }
}

// 自定义非受检异常
class InvalidInputException extends RuntimeException {
    public InvalidInputException(String message) {
        super(message);
    }
}

3. 实际应用场景
  • 校验用户输入

    • 示例:检查用户注册时的用户名是否符合规则。
    void validateUserName(String userName) throws UserNameAlreadyExistsException {
        if ("admin".equals(userName)) {
            throw new UserNameAlreadyExistsException("用户名已存在");
        }
    }
    
  • 业务逻辑控制

    • 示例:订单支付失败时抛出自定义异常。
    void processPayment(double amount) {
        if (amount <= 0) {
            throw new InvalidInputException("支付金额必须大于0");
        }
    }
    

    💡 面试官视角

  • 面试官可能会问“为什么需要自定义异常?”答:自定义异常能够更精确地描述业务错误,提供更有意义的错误信息,便于排查问题。

  • 面试官可能会追问“受检异常和非受检异常如何选择?”答:如果希望强制调用者处理异常(如文件读取失败),使用受检异常;如果是运行时逻辑错误(如空指针),使用非受检异常。