Java:初始化错误的适当异常
Posted
技术标签:
【中文标题】Java:初始化错误的适当异常【英文标题】:Java: Appropriate exception for initialization error 【发布时间】:2012-03-29 21:09:18 【问题描述】:当静态工厂方法无法初始化新对象时,我应该抛出哪个异常?我更喜欢提出一个有意义的异常而不是返回null
。
【问题讨论】:
这将取决于导致失败本身的原因,即网络问题、文件读取失败等。 你的意思是我应该抛出初始化期间遇到的任何异常? 不一定,但你的例外应该有意义地告诉你出了什么问题,而不仅仅是 something 出了问题。 【参考方案1】:如果你因为数据不足而在 Factory 中抛出异常,我喜欢抛出 IllegalStateException
,其描述类似于“无法构造 X,未设置 Y”。
如果您由于数据冲突而在工厂中抛出异常,我喜欢抛出一个
IllegalStateException
的描述类似于“无法构造 X,Y 与 Z 冲突”。
如果您由于错误(或无意义的)值而在工厂中引发异常,我喜欢使用类似于“Y 不能是 A”的描述来引发 IllegalArgumentException
。
如果您由于缺少值而在 Factory 中引发异常,我喜欢使用类似于“Y 不能为空”的描述来引发 IllegalArgumentException
。
最后一个偏好取决于一些争论。有人建议最好扔一个NullPointerException
;就我而言,我们不惜一切代价避免它们,因为许多客户倾向于不阅读异常消息(并假设 NullPointerException 意味着编码错误)。
在任何情况下,您都应该提供一个好的、具体的信息来说明引发异常的原因,以减轻您在几个月后看到该异常引发的未来支持成本。
【讨论】:
【参考方案2】:是的,问题的原因是您最好的选择。如果参数不正确,可以抛出IllegalArgumentException,如果某个文件不存在,可以抛出FileNotFoundException,如果工厂没有正确初始化,可以抛出IllegalStateException,等等……
但是,创建自己的异常很容易。只需将您的类声明为extends Exception
并添加委托构造函数。如果你扩展 Exception,那么可以抛出它的方法必须用throws
声明。如果你不想这样,你可以扩展 RuntimeException,那些不需要声明。
【讨论】:
【参考方案3】:理想情况下,您希望扩展 Exception
并制作自己的 IntializatonException
。
【讨论】:
【参考方案4】:这样的东西可能应该只是一个断言,但如果事实上这有可能失败,那么对你有意义的自定义异常将是我的选择。
【讨论】:
【参考方案5】:您可以通过扩展异常类来创建自己的异常
【讨论】:
这种情况没有内置异常吗?这是很常见的情况。 我几乎不会把抛出异常的构造函数称为常见场景 有很多例外,但如果需要显示自定义消息,拥有自己的更灵活以上是关于Java:初始化错误的适当异常的主要内容,如果未能解决你的问题,请参考以下文章