Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 由于缺少系统属性而引发的正确异常_Java - Fatal编程技术网

Java 由于缺少系统属性而引发的正确异常

Java 由于缺少系统属性而引发的正确异常,java,Java,假设我有一个系统属性MY_PROP: java -DMY_PROP="My value" 此属性是我的系统工作所必需的 如果未设置此属性,则正确抛出的异常是什么 @PostConstruct private void init() { myProp = System.getProperty("MY_PROP"); if (myProp == null) { throw new ???? } // ... } 不知何故,IllegalAr

假设我有一个系统属性
MY_PROP

java -DMY_PROP="My value"
此属性是我的系统工作所必需的

如果未设置此属性,则正确抛出的异常是什么

@PostConstruct
private void init() {

    myProp = System.getProperty("MY_PROP");
    if (myProp == null) {
        throw new ????
    }
    // ...   
}

不知何故,
IllegalArgumentException
感觉不对劲。可能是
IllegalStateException
MissingResourceException
TypeNotPresentException
?此场景的标准做法是什么?

因为系统属性并不总是定义的,标准做法是在找不到属性时使用默认值

我刚刚检查了java 7中的一些标准代码(ApacheTomcat、java.lang、java.awt等等),当属性为
null
时,它们总是使用默认的“回退”

那么你的问题可能在别的地方


为什么不把这个参数作为jar的必需参数呢?然后您可以使用
IllegalArgumentException

没有。我会抛出
非法状态异常
,因为您缺少参数。这意味着配置验证器失败,应用程序处于无效状态。换句话说,您永远不能调用
init()

如果参数的值无效,那么我将抛出一个
IllegalArgumentException

如果您正在编写一个验证器,您应该在使用
RuntimeException
还是选中一个之间做出决定。例如使用javax.naming.ConfigurationException`,或创建自己的配置异常时。您的API将能够处理此类异常,并根据遗留问题做出正确的反应

定义:

-表示方法在非法或不适当的时间被调用。换句话说,Java环境或Java应用程序对于请求的操作没有处于适当的状态


-抛出以指示已向方法传递了非法或不适当的参数。

我只添加了Vash对Spring框架的回答。如果您使用的是Spring框架,并且希望与Spring中大多数组件的使用方式保持一致,那么我建议您应该使用IllegalStateException(或您自己的派生)

在Spring中,大多数执行
@PostConstruct
@重写void afterPropertiesSet()
的组件使用util
org.springframework.util.Assert.state(…)
抛出
非法状态异常

您可以在中看到这是一个示例


也就是说,我已经针对SpringMVC而不是定制的更显式的派生类提交了bug。使用静态内联类,在不创建另一个Java文件的情况下创建自定义异常非常容易。

感谢Magnus的输入,但是如果说
MY_PROP
没有合理的默认值,我真的想抛出异常(或错误,因为没有此属性,系统将无法使用)。抛出什么样的异常最好?我认为您应该编写自己的异常。因为没有标准的异常(因为这不是一个标准的实践)。也许我应该编写一个自定义的
MissingSystemPropertyException
,它扩展了
IllegalStateException
?创建IllegalStateException或RuntimeException的子类绝对没有什么丢脸的。我希望有更多的库这样做,而不是抛出像IllegalState、Runtime、IllegalArgument等一般异常。@AdamGent,你是对的。我稍微修改了我的答案。选中的异常在设计级别上存在问题。它们既有帮助,也有限制。这件事我已经忘了一会儿了。谢谢提醒。为什么不创建自己的异常呢?e、 g.
丢失系统属性异常