自定义RuntimeException

自定义运行异常

在 Java 中,自定义异常类是一个常见的需求,特别是当你需要创建特定的业务逻辑异常时。自定义 RuntimeException 可以让你创建一个不需要显式捕获或声明的异常(即非受检异常)。

以下是如何自定义一个 RuntimeException 的步骤:

步骤一:创建自定义异常类

  1. 继承 RuntimeException:创建一个新的类并继承 RuntimeException
  2. 定义构造函数:根据需要定义不同的构造函数,例如默认构造函数、带消息的构造函数、带消息和原因的构造函数等。

示例代码

以下是一个自定义 RuntimeException 的示例:

public class CustomRuntimeException extends RuntimeException {

    // 默认构造函数
    public CustomRuntimeException() {
        super();
    }

    // 带消息的构造函数
    public CustomRuntimeException(String message) {
        super(message);
    }

    // 带消息和原因的构造函数
    public CustomRuntimeException(String message, Throwable cause) {
        super(message, cause);
    }

    // 带原因的构造函数
    public CustomRuntimeException(Throwable cause) {
        super(cause);
    }
}

使用自定义异常

你可以在代码中像使用其他异常一样使用自定义异常:

public class CustomRuntimeExceptionDemo {
    public static void main(String[] args) {
        try {
            // 模拟一个异常情况
            throw new CustomRuntimeException("This is a custom runtime exception");
        } catch (CustomRuntimeException e) {
            System.out.println("Caught custom runtime exception: " + e.getMessage());
        }
    }
}

解释

  1. 默认构造函数:无参数构造函数,调用父类的无参数构造函数。
  2. 带消息的构造函数:接受一个字符串参数 message,调用父类的带消息的构造函数。
  3. 带消息和原因的构造函数:接受一个字符串参数 message 和一个 Throwable 参数 cause,调用父类的带消息和原因的构造函数。
  4. 带原因的构造函数:接受一个 Throwable 参数 cause,调用父类的带原因的构造函数。

总结

通过自定义 RuntimeException,你可以创建特定的业务逻辑异常,使代码更加清晰和易于维护。自定义异常类可以包含额外的信息和方法,以便更好地描述和处理异常情况。

如果不调用super(message);

在 Java 中,当你创建一个自定义异常类并且不调用父类构造函数(例如 super(message)),父类的默认构造函数将会被调用。如果父类没有默认构造函数,编译器会报错。

具体情况分析

  1. 父类有默认构造函数

    • 如果父类(例如 RuntimeException)有默认构造函数,那么即使你不显式调用 super(message),编译器也会隐式调用父类的默认构造函数。
    • 这意味着异常对象将不会包含你传递的消息,调用 getMessage() 方法将返回 null
  2. 父类没有默认构造函数

    • 如果父类没有默认构造函数(例如某些自定义异常类),那么不调用 super(message) 会导致编译错误,因为编译器无法找到合适的父类构造函数来调用。

示例代码

以下是一个示例,展示了不调用 super(message) 的情况:

public class CustomRuntimeException extends RuntimeException {

    // 带消息的构造函数,但不调用 super(message)
    public CustomRuntimeException(String message) {
        // super(message); // 这行代码被注释掉了
    }
}

public class CustomRuntimeExceptionDemo {
    public static void main(String[] args) {
        try {
            // 抛出自定义异常
            throw new CustomRuntimeException("This is a custom runtime exception");
        } catch (CustomRuntimeException e) {
            // 打印异常消息
            System.out.println("Caught custom runtime exception: " + e.getMessage());
        }
    }
}

输出结果

Caught custom runtime exception: null

解释

  • CustomRuntimeException 的构造函数中,我们没有调用 super(message)
  • 因此,RuntimeException 的默认构造函数被调用,异常对象没有被初始化为包含传递的消息。
  • 当我们捕获并打印异常消息时,getMessage() 返回 null

总结

不调用 super(message) 会导致异常对象不包含传递的消息,从而使得异常信息丢失。为了确保异常对象包含有用的调试信息,通常应该在自定义异常类的构造函数中调用父类的相应构造函数,例如 super(message)super(message, cause)

重写 getMessage() 方法

是的,你可以在自定义异常类中重写 getMessage() 方法,以提供自定义的异常消息。这种方法可以让你在不调用父类构造函数的情况下,仍然能够返回有意义的异常消息。

示例代码

以下是一个示例,展示了如何重写 getMessage() 方法:

public class CustomRuntimeException extends RuntimeException {
    private String customMessage;

    // 带消息的构造函数,不调用 super(message)
    public CustomRuntimeException(String message) {
        this.customMessage = message;
    }

    // 重写 getMessage 方法
    @Override
    public String getMessage() {
        return customMessage;
    }
}

public class CustomRuntimeExceptionDemo {
    public static void main(String[] args) {
        try {
            // 抛出自定义异常
            throw new CustomRuntimeException("This is a custom runtime exception");
        } catch (CustomRuntimeException e) {
            // 打印异常消息
            System.out.println("Caught custom runtime exception: " + e.getMessage());
        }
    }
}

输出结果

Caught custom runtime exception: This is a custom runtime exception

解释

  1. 自定义异常类

    • CustomRuntimeException 类中,我们定义了一个私有字段 customMessage 来存储自定义的异常消息。
    • 在构造函数中,我们将传入的消息赋值给 customMessage,而不是调用 super(message)
    • 重写 getMessage() 方法,使其返回 customMessage
  2. 使用自定义异常

    • CustomRuntimeExceptionDemo 类中,我们抛出并捕获 CustomRuntimeException
    • 调用 getMessage() 方法时,返回的是 customMessage 的值。

总结

通过重写 getMessage() 方法,你可以在自定义异常类中提供自定义的异常消息,而不需要调用父类的构造函数。这种方法可以让你更灵活地控制异常消息的内容和格式。

注意:虽然重写 getMessage() 方法可以实现自定义异常消息,但通常推荐使用父类的构造函数来初始化异常消息,因为这符合 Java 异常处理的惯例,并且可以利用父类提供的其他功能(如 getLocalizedMessage()toString() 方法)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你这个代码我看不懂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值