在创建异常类时,我应该实现java.lang.Exception的所有构造函数吗?

时间:2013-01-14 10:15:39

标签: java exception

创建异常类时,只提供“特定”构造函数是可以的:

public CircularLinkException(final String msg, final String link)
{
    super(msg);
    link = inputName;
}

或者我应该实现Exception的构造函数:

public class CircularLinkException extends Exception
{
    public CircularLinkException() { /* ... */ }
    public CircularLinkException(final String msg) { /* ... */ }
    public CircularLinkException(final Throwable t) { /* ... */ }
    public CircularLinkException(final String msg, final Throwable t) { /* ... */ }
}

6 个答案:

答案 0 :(得分:10)

您应该创建您将使用的所有构造函数。

当你想象某事物的用途时,不要添加代码。当你需要它时添加它。

http://c2.com/xp/YouArentGonnaNeedIt.html

答案 1 :(得分:1)

实现任何特定构造函数实际上并不是必需。可以实现一个任意的,以便构造异常。

通常会发生两种情况:

  • 您的代码在检查完东西后意识到出了问题。它想提出异常。对于这种情况,需要一个接收字符串消息的构造函数。通常在消息中解释出错了。
  • 您的代码尝试执行某些操作并捕获因未声明而无法进一步抛出的异常。然后你仍然可以解释消息中出错,在那里放置一些重要的上下文数据,但是为诊断提供捕获的异常也是至关重要的。对于这种情况,您需要一个带String和Throwable的构造函数。

我认为,没有参数的版本和仅使用Throwable的版本对于懒惰的人来说更多,而你只是通过不实现这些来强制执行代码中的更多顺序。

如果您的特定异常受益于一些始终可用的其他信息,那么构造函数肯定应该有其他参数,强制传递此信息。在您的情况下,应该保留具有两个字符串参数的版本,但可能是一个也将Throwable作为第三个参数的版本会很好。许多已知的异常(例如IOException)经历了“我们永远不需要这种构造函数”的痛苦,以便在更高版本中添加这样的构造函数。

答案 2 :(得分:0)

您只能声明specific构造函数。

答案 3 :(得分:0)

据我所知,你想做出自己的异常

public class CircularLinkException extends Exception

因此您可以为CircularLinkException拥有任意数量的构造函数,但每个构造函数都应调用super(smthg),其中{{1}}中的一个是here

答案 4 :(得分:0)

没有必要在你的班级中拥有所有构造函数。根据您的需要创建构造函数,但请记住,java中的Exception类没有默认构造函数,因此总是从子类的第一行调用父类构造函数,同时进行自己的异常(自定义异常)。

答案 5 :(得分:0)

可以提供特定的构造函数,并且可以在需要时添加更多构造函数。就个人而言,我不会去超级班的所有构造者。

但这一切都取决于将如何使用新的Exception类“CircularLinkException”。如果此异常类是某些异常库的一部分,将由其他用户使用,则可能是,提供“Exception类的构造函数”+“新构造函数”是一个好主意。这样,用户可以根据需要选择构造函数。

如果您是此异常类的唯一用户,那么最好分析哪些构造函数对您的代码有用并仅编写它们。如果您认为某些构造函数在将来会有用,您可以在将来编写它们:)。