自定义异常
在Java中,创建自定义异常类可以帮助你更好地处理特定业务逻辑中的错误情况。自定义异常通常继承自Exception(用于已检查异常)或RuntimeException(用于未检查异常)。下面是自定义异常的定义和使用过程的详细介绍。
1. 定义自定义异常类
1.1 继承自Exception(已检查异常)
如果你希望异常是已检查的(即必须在编译时处理),可以让你的自定义异常类继承自Exception。
示例代码:
public class MyCheckedException extends Exception {
public MyCheckedException(String message) {
super(message);
}
public MyCheckedException(String message, Throwable cause) {
super(message, cause);
}
}
1.2 继承自RuntimeException(未检查异常)
如果你希望异常是未检查的(即不强制要求处理),可以让你的自定义异常类继承自RuntimeException。
示例代码:
public class MyUncheckedException extends RuntimeException {
public MyUncheckedException(String message) {
super(message);
}
public MyUncheckedException(String message, Throwable cause) {
super(message, cause);
}
}
2. 使用自定义异常
2.1 在方法中抛出自定义异常
当业务逻辑中发生错误时,可以通过throw语句抛出自定义异常。
示例代码:
public class UserService {
public void registerUser(String username) throws MyCheckedException {
if (username == null || username.isEmpty()) {
throw new MyCheckedException("用户名不能为空");
}
// 注册用户的其他逻辑
}
public void validateUser(String username) {
if (username == null || username.isEmpty()) {
throw new MyUncheckedException("用户名无效");
}
// 验证用户的其他逻辑
}
}
2.2 捕获和处理自定义异常
在调用抛出自定义异常的方法时,你可以使用try-catch块来捕获并处理异常。
示例代码:
public class Main {
public static void main(String[] args) {
UserService userService = new UserService();
// 处理已检查异常
try {
userService.registerUser(null);
} catch (MyCheckedException e) {
System.out.println("捕获到已检查异常: " + e.getMessage());
}
// 处理未检查异常
try {
userService.validateUser(null);
} catch (MyUncheckedException e) {
System.out.println("捕获到未检查异常: " + e.getMessage());
}
}
}
3. 最佳实践
- 合理命名:自定义异常的名称应当简洁明了,能够直接反映出错误的性质,如InvalidAgeException、UserNotFoundException等。
- 提供详细信息:自定义异常类应支持错误信息的传递,以便在捕获异常时能够清楚地了解问题所在。可以在构造函数中传递错误消息和异常原因。
- 继承合适的类:根据需要选择继承Exception或RuntimeException,前者用于强制处理的情况,后者用于不需要强制处理的情况。
通过使用自定义异常,你可以使代码更具可读性和可维护性,清晰地反映出业务逻辑中的特殊情况或错误,帮助开发者和维护者快速定位问题。