java如何自定义异常
自定义异常的基本步骤
在Java中自定义异常需要继承自Exception类或其子类。通常推荐继承RuntimeException创建非受检异常,或继承Exception创建受检异常。
// 自定义非受检异常示例
public class MyUncheckedException extends RuntimeException {
public MyUncheckedException(String message) {
super(message);
}
}
// 自定义受检异常示例
public class MyCheckedException extends Exception {
public MyCheckedException(String message) {
super(message);
}
}
自定义异常的最佳实践
为自定义异常提供多个构造方法,包括默认构造方法、带消息的构造方法、带消息和原因的构造方法等。这样可以提高异常的灵活性。
public class CustomException extends Exception {
public CustomException() {
super();
}
public CustomException(String message) {
super(message);
}
public CustomException(String message, Throwable cause) {
super(message, cause);
}
public CustomException(Throwable cause) {
super(cause);
}
}
自定义异常的使用场景
自定义异常通常用于表示特定的业务逻辑错误。相比使用Java内置的通用异常,自定义异常能更准确地描述问题,使代码更易理解和维护。
public class Account {
private double balance;
public void withdraw(double amount) throws InsufficientFundsException {
if (amount > balance) {
throw new InsufficientFundsException("余额不足,当前余额:" + balance);
}
balance -= amount;
}
}
// 自定义业务异常
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}
自定义异常的序列化考虑
如果自定义异常可能需要跨网络传输,应实现Serializable接口并提供serialVersionUID字段,确保异常对象能够正确序列化和反序列化。
public class SerializableException extends Exception implements Serializable {
private static final long serialVersionUID = 1L;
public SerializableException(String message) {
super(message);
}
}
自定义异常的日志记录
在抛出和捕获自定义异常时,应考虑添加适当的日志记录,便于问题排查。可以在异常类中添加日志记录方法,或在捕获处记录。
public class LoggableException extends Exception {
public void logError() {
Logger.getLogger(LoggableException.class.getName())
.log(Level.SEVERE, this.getMessage(), this);
}
}





