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()
的组件使用utilorg.springframework.util.Assert.state(…)
抛出非法状态异常
您可以在中看到这是一个示例
也就是说,我已经针对SpringMVC而不是定制的更显式的派生类提交了bug。使用静态内联类,在不创建另一个Java文件的情况下创建自定义异常非常容易。感谢Magnus的输入,但是如果说MY_PROP
没有合理的默认值,我真的想抛出异常(或错误,因为没有此属性,系统将无法使用)。抛出什么样的异常最好?我认为您应该编写自己的异常。因为没有标准的异常(因为这不是一个标准的实践)。也许我应该编写一个自定义的MissingSystemPropertyException
,它扩展了IllegalStateException
?创建IllegalStateException或RuntimeException的子类绝对没有什么丢脸的。我希望有更多的库这样做,而不是抛出像IllegalState、Runtime、IllegalArgument等一般异常。@AdamGent,你是对的。我稍微修改了我的答案。选中的异常在设计级别上存在问题。它们既有帮助,也有限制。这件事我已经忘了一会儿了。谢谢提醒。为什么不创建自己的异常呢?e、 g.丢失系统属性异常
?