面试题答案
一键面试- 继承体系
- 选择合适的基类:通常继承自
Exception
类,如果该异常是可恢复的;若为不可恢复的错误,比如编程错误等,继承自RuntimeException
类。例如,自定义一个业务逻辑异常,可以继承Exception
:
- 选择合适的基类:通常继承自
public class CustomBusinessException extends Exception {
public CustomBusinessException(String message) {
super(message);
}
}
继承RuntimeException
示例:
public class CustomRuntimeException extends RuntimeException {
public CustomRuntimeException(String message) {
super(message);
}
}
- 异常信息的设置
- 提供有意义的信息:异常信息应清晰地描述异常发生的原因,帮助开发人员快速定位问题。例如,在文件读取异常中,可以包含文件名、具体错误原因等。
public class FileReadException extends Exception {
public FileReadException(String fileName, String errorMessage) {
super("Failed to read file " + fileName + ": " + errorMessage);
}
}
- 国际化支持:如果应用程序需要支持多语言,异常信息应支持国际化。可以使用
ResourceBundle
来管理不同语言的异常消息。
- 异常抛出的时机
- 尽早抛出:一旦检测到不符合预期的条件,应尽早抛出异常。例如,在方法参数校验时,如果参数不符合要求,立即抛出异常。
public void processData(int value) {
if (value < 0) {
throw new IllegalArgumentException("Value cannot be negative");
}
// 正常业务逻辑
}
- 避免过度抛出:不要在不必要的地方抛出异常,增加代码的复杂性。如果可以通过返回特定值或状态码来表示异常情况,并且调用者可以合理处理,优先选择这种方式。但对于无法恢复或严重影响程序正常运行的情况,还是应该抛出异常。
- 符合业务逻辑:异常抛出应与业务逻辑紧密相关,比如在订单处理流程中,当库存不足时抛出
InsufficientStockException
,这样调用者可以根据业务需求进行相应处理,如提示用户或尝试其他库存策略。