异常处理 (Exception Handling) - 第二部分

异常处理 (Exception Handling) - 第二部分

💡 原文中文,约4100字,阅读约需10分钟。
📝

内容提要

本文讨论了Java中异常处理的两个高级特性:自定义异常类和catch多个异常。自定义异常类可以提供更准确的异常描述,继承Exception类使其成为检查异常。可以使用带参构造函数传递异常信息。catch多个异常可以在一个catch块中处理多个异常,使代码更简洁。

🔎

延伸解读

自定义异常类的设计考量

文章指出,自定义异常类通常继承Exception类,使其成为检查异常,这要求调用者必须处理。这种设计强制了异常处理,但可能增加代码复杂度。开发者需权衡:是使用现有异常类(如ArithmeticException)还是自定义,以提升代码可读性。文章示例中,GradeException比ArithmeticException更贴切,但需注意检查异常对方法签名的影响。

传递异常信息的正确方式

文章强调,应通过带String参数的构造函数传递异常信息,而非重写toString方法。重写toString虽能工作,但不标准,且可能破坏异常序列化等机制。使用super(message)可确保信息被正确存储和显示。此外,可定义无参构造函数提供默认信息,但需注意这可能导致信息不够具体,应谨慎使用。

catch多个异常的语法与限制

使用|分隔多个异常类名,可在同一个catch块中处理它们,使代码更简洁。但需注意,这些异常类不能有子父类关系,否则编译错误。文章示例中,ArrayIndexOutOfBoundsException和ArithmeticException无继承关系,因此可行。这种写法避免了使用Exception父类捕获所有异常,保持了异常处理的精确性。

❓

Q&A

Java中如何自定义一个异常类?

自定义异常类需要继承Exception类或RuntimeException类。通常选择继承Exception类,使其成为检查异常。基本形式为:class CustomException extends Exception {}。可以添加带参构造函数来传递异常信息。

自定义异常类时,如何传递异常信息?

可以通过带String参数的构造函数传递异常信息,该构造函数调用父类的super(message)方法。例如:public CustomException(String message) { super(message); }。抛出时使用throw new CustomException("错误信息");,打印时会显示异常类名和错误信息。

为什么不应该重写自定义异常类的toString方法?

虽然重写toString方法可以使代码正常工作,但这样做是不标准的。应该使用带String参数的构造函数来传递异常信息,因为异常类本身提供了这样的构造函数,且这是标准做法。

如何为自定义异常类设置默认错误信息?

可以自定义无参构造函数,并在其中调用父类Exception的带参构造函数,传入默认错误信息。例如:public CustomException() { super("默认错误信息"); }。这样即使抛出异常时不提供参数,也会显示默认错误信息。

Java中如何在一个catch块中捕获多个异常?

在catch的括号中使用竖线|分隔不同的异常类名即可。例如:catch (ArrayIndexOutOfBoundsException | ArithmeticException e) { ... }。这样同一个catch块可以处理多个异常,且处理方式相同,使代码更简洁。

catch多个异常有什么好处?

catch多个异常可以使代码更加简洁,因为可以对不同的异常作出相同的处理,而不需要编写多个catch块。同时,仍然允许我们不去使用Exception类的父类来捕获所有异常。

➡️

继续阅读