当静态工厂方法无法初始化新对象时,我应该抛出哪个异常?我更喜欢提出一个有意义的例外,而不是返回null
。
答案 0 :(得分:38)
如果由于数据不足而在工厂中抛出异常,我想抛出IllegalStateException
,其描述类似于“无法构造X,没有设置Y”。
如果由于数据冲突而在工厂中抛出异常,我想扔一个
IllegalStateException
的描述类似于“无法构造X,Y与Z冲突”。
如果由于错误(或无意义)值而在工厂中抛出异常,我想抛出一个IllegalArgumentException
,其描述类似于“Y不能是A”。
如果由于缺少值而在工厂中抛出异常,我想抛出一个IllegalArgumentException
,其描述类似于“Y不能为空”。
最后的偏好取决于一些争论。有些人认为抛出NullPointerException
可能会更好;在我的情况下,我们不惜一切代价避免它们,因为许多客户往往不会读取异常消息(并假设NullPointerException意味着编码错误)。
无论如何,您应该提供一个好的,具体的消息,说明为什么会抛出异常,以减轻您在未来几个月内发现异常的未来支持成本。
答案 1 :(得分:2)
您可以通过扩展Exception类
来创建自己的Exception答案 2 :(得分:2)
这样的事情可能应该只是一个断言,但如果事实上有可能失败,那么对我来说有意义的自定义异常就是我的选择。
答案 3 :(得分:2)
是的,问题的原因是你最好的选择。如果参数不正常,你可以抛出IllegalArgumentException,如果某个文件不存在,你可以抛出FileNotFoundException,如果工厂没有正确初始化,你可以抛出IllegalStateException等等......
但是,创建自己的Exception很容易。只需将您的类声明为extends Exception
并添加委托构造函数。如果扩展Exception,则必须使用throws
声明可以抛出它的方法。如果你不想这样,可以扩展RuntimeException,不需要声明那些。
答案 4 :(得分:1)
理想情况下,您希望扩展Exception
并制作自己的IntializatonException
。