因缺少系统属性而抛出正确的异常

Ant*_*oly 11 java

说我有一个系统属性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 - 抛出以指示方法已传递非法或不适当的参数.

  • 也许我应该编写一个扩展`IllegalStateException`的自定义`MissingSystemPropertyException`? (2认同)
  • 在创建IllegalStateException或RuntimeException的子类时绝对没有羞耻感.我希望更多的库做到这一点,而不是抛出像IllegalState,Runtime,IllegalArgument等一般的异常. (2认同)

Ada*_*ent 5

我只添加了 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 文件。