如何在Java中创建自定义异常类
在Java异常处理中,有许多异常类可用于处理异常。尽管有时我们可能找不到合适的异常类来清楚地表示从代码中引发的异常,但是在这种情况下,我们可以选择创建自己的自定义异常类。在本文中,我们将介绍如何在Java中创建自定义异常类。
何时选择用户定义的异常类
当我们想在Java中创建自己的自定义异常类时,Java文档会明确指定方案。如果对以下任何一个问题的回答为是,则应编写自己的异常类;否则,我们可能可以使用别人的。
我们是否需要Java平台中没有的异常类型?
如果他们可以将异常与其他供应商编写的类所抛出的异常区分开来,它将对用户有帮助吗?
代码是否抛出多个相关异常?
如果我们使用其他人的例外,用户是否可以访问这些例外?一个类似的问题是,包裹是否应该独立且自成体系?
在Java中创建自定义异常类
为了创建自己的异常类,我们可以扩展Exception类或者RunTimeException类。
如果希望将Java自定义异常作为已检查的异常(强制使用try-catch块处理该异常或者使用throws子句进行声明),则需要扩展Exception类。
如果我们希望自定义异常是未经检查的异常,而无需在try-catch块中包含代码或者声明该异常,则需要扩展RuntimeException类。
用于创建自定义异常类的Java示例代码
这是一个简单的示例,展示了如何在Java中创建自定义异常类。
假设我们有一个不希望传递大于100的数字的应用程序。如果传递的数字大于100,则要引发InvalidNumberException,这是一个自定义异常类。
通过扩展RuntimeException类,在示例代码中将InvalidNumberException实现为未经检查的异常。
InvalidNumberException.java
public class InvalidNumberException extends RuntimeException { private int num; // Demonstrating all the 4 constructors InvalidNumberException(){ super(); } InvalidNumberException(int num){ this.num = num; } InvalidNumberException(int num, String msg){ super(msg); this.num = num; } InvalidNumberException(int num, String msg, Throwable cause){ super(msg, cause); this.num = num; } public String toString() { return "InvalidNumberException for number " + num; } public String getMessage() { return "InvalidNumberException for number " + num; } }
MyExceptionDemo.java
public class MyExceptionDemo { public static void main(String[] args) { process(5); process(200); } public static void process(int num){ System.out.println("In method process- " + num); if (num > 100){ throw new InvalidNumberException(num); } } }
输出:
In method process- 5 In method process- 200 Exception in thread "main" InvalidNumberException for number 200 at com.theitroad.MyExceptionDemo.process(MyExceptionDemo.java:14) at com.theitroad.MyExceptionDemo.main(MyExceptionDemo.java:7)
自定义异常为选中还是未选中
为了在检查的异常与未检查的异常之间做出决定,我们必须遵循以下规则。
如果客户端可以采取某些措施来从异常中恢复,请将自定义异常作为已检查的异常。
如果客户端无法采取任何措施来从异常中恢复,请将自定义异常设为未经检查的异常。
例如,如果引发异常时所有要做的就是记录错误,并且不尝试从该错误中恢复,那么最好使用RunTimeException。