2010-02-03 86 views
18

当构造函数无法处理的构造函数中的方法抛出检查异常时,如果确定应用程序无法处理它并且在没有对象正在构建?构造函数可以抛出运行时异常吗?

+6

是的,从构造函数中抛出异常是放弃创建对象的标准方式。 – 2010-02-03 18:59:16

+0

+1 - OOP的新来者的好问题 – JonH 2010-02-03 19:00:08

回答

11

是的,这是不可避免的在许多构造反正当他们调用其他方法,因为总有一种可能性,他们已经将抛出unchecked异常。

+0

这是一个很好的观点。 – insipid 2010-02-03 19:08:17

4

是的,在构造函数中抛出异常是完全有效的。你很少或根本没有别的选择,只能做到这一点,特别是当你只是试图构造一个对象时,只有没有正确的工作

+0

澄清,你是否说它可以转换为未经检查的例外。或者你的意思是添加一个throws子句? – insipid 2010-02-03 19:03:46

+4

我经常会用描述它的字符串抛出'IllegalArgumentException'。 – philfreo 2010-02-03 19:13:31

1

是的。除非你知道应该如何处理异常,否则最好扔掉它,而不是简单地吞下它并打印出堆栈跟踪(或者更糟糕的是,什么都不做)。

这将有助于防止稍后出现一些极其难以调试的错误。

11

是的。这是标准做法。

Effective Java, 2nd Ed.这是由项目61覆盖,“把适合于抽象例外”。在第58项“对可恢复条件使用已检查的异常以及编程错误的运行时异常”中,有效Java也覆盖了生成的异常是否已选中或未选中。

认为这是一种构造函数,而不是一个正常的方法是不是一个真正的问题。 (事实上​​,构造函数可以说有更多的自由,因为它们不受超级界面的约束。)

当抛出一个异常作为另一个异常的结果时,确保你设置新的cause是个好主意例外。

+1

+1为好源 – insipid 2010-02-03 19:29:44

+1

所有参考Effective Java的答案值得+1 :) – Fredrik 2011-10-18 10:20:46

2

如Chris Jester-Young所评论的那样,抛出检查异常以表示构建对象失败是完全可以的。另一个问题是,抛出未选中例外是个好主意。你会放松编译器的唠叨,它促使你捕捉和处理异常,你一定会这么做。

+0

为什么你想要?更多的时候,你不想处理它,它是一个错误,让它运行到一个记录器/作业处理程序的堆栈。 – reto 2011-09-29 15:47:11

1

个人而言,我讨厌看到构造函数抛出checked异常(如doppeldish已经指出的那样)。不过,你如何确定应用程序无法处理异常呢?即使应用程序无法处理它,也许用户可以通过再次尝试?

+0

+1需要考虑的事情:P谢谢 – insipid 2010-02-05 20:20:11

相关问题