说我有一个系统属性MY_PROP:
java -DMY_PROP="My value"
Run Code Online (Sandbox Code Playgroud)
此属性是我的系统工作所必需的.
如果未设置此属性,则抛出的正确异常是什么?
@PostConstruct
private void init() {
myProp = System.getProperty("MY_PROP");
if (myProp == null) {
throw new ????
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
不知何故IllegalArgumentException感觉不对.也许IllegalStateException,MissingResourceException,TypeNotPresentException?这种情况的标准做法是什么?
Dam*_*ash 17
空无一人.我会抛出IllegalStateException,因为你错过了参数.这意味着配置验证程序失败并且您的应用程序处于无效状态.换句话说,你永远不应该打电话给你init().
如果参数的值无效,那么我会抛出一个IllegalArgumentException.
如果您正在编写验证器,则应决定使用RuntimeException还是选中验证器.当使用例如javax.naming.ConfigurationException`时,或者创建自己的一个配置异常.您的API将能够处理此类异常并在遗留条件下做出正确反应.
定义:
IllegalStateException - 表示在非法或不适当的时间调用了方法.换句话说,Java环境或Java应用程序未处于所请求操作的适当状态.
IllegalArgumentException - 抛出以指示方法已传递非法或不适当的参数.
我只添加了 Vash 对 Spring Framework 的回答。如果您使用 Spring 框架并且希望与 Spring 中的大多数组件的做法保持一致,那么我会说您应该使用 IllegalStateException(或您自己的派生)。
在 Spring 中,大多数使用 util执行 a@PostConstruct或@Override void afterPropertiesSet()throw 的组件。IllegalStateExceptionorg.springframework.util.Assert.state(..)
作为一个例子,您可以在Spring AMQP 中看到这一点。
话虽如此,我实际上已经针对 Spring MVC 提交了错误,他们使用 IllegalArgumentException而不是自定义且更明确的派生类。使用静态内联类很容易创建自定义异常,而无需创建另一个 Java 文件。