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:初始化错误的适当异常的主要内容,如果未能解决你的问题,请参考以下文章

在java中常出现的异常和解决方法

Java中常见的异常

java电商项目常见异常

java assertionerror是啥异常

Java中常见的异常处理汇总

JAVA中常用的异常处理情况