Java 尝试插入重复密钥时引发的异常是否正确?

Java 尝试插入重复密钥时引发的异常是否正确?,java,exception-handling,Java,Exception Handling,我反复看到关于避免抛出泛型RuntimeException的评论,我正试图遵循这条准则 我有一个类,它使用属性设置聚合一个SortedMap,以允许或禁止重复键。我试图弄清楚,当不允许重复密钥并且试图添加一个密钥时,我应该抛出什么异常 我检查了Java文档中的异常类,发现没有一个已知的直接子类是合适的。例如,我是否要继续创建自己的EDuplicateMapKey类并抛出它?如果是这样的话,我如何避免以一大堆类文件结束,每个自定义异常类型对应一个类文件 这里的“最佳实践”是什么?创建您自己的例外。

我反复看到关于避免抛出泛型
RuntimeException
的评论,我正试图遵循这条准则

我有一个类,它使用属性设置聚合一个
SortedMap
,以允许或禁止重复键。我试图弄清楚,当不允许重复密钥并且试图添加一个密钥时,我应该抛出什么异常

我检查了Java文档中的
异常
类,发现没有一个已知的直接子类是合适的。例如,我是否要继续创建自己的
EDuplicateMapKey
类并抛出它?如果是这样的话,我如何避免以一大堆类文件结束,每个自定义
异常类型对应一个类文件


这里的“最佳实践”是什么?

创建您自己的例外。例如JavaEE,您可以对自定义映射执行类似的操作

例如,我是否要继续创建自己的EducomplicateMapkey类并抛出它

当然,是的。如果感觉正确的话,不要害怕创建新的异常类型。如果作为作者,您不清楚使用哪种异常类型,那么使用API的程序员肯定不清楚。因此,将其显式化,并创建自己的异常类型

如何避免以一大堆类文件结束,每个自定义异常类型对应一个类文件


异常类与任何其他业务逻辑类型没有区别。在创建“正常”代码所需的类型时,您不会感到受到限制(至少,我希望您不会这样做),在异常类型方面,您也不会有任何不同。它们通常同样重要。

就个人而言,或者看起来在这里也能起作用,但我也能看到反对这一点的论据

未选中RuntimeException子类。这意味着抛出声明和try/catch不是必需的。因此,RuntimeException子类通常被认为是不应该发生的事情(逻辑/程序员错误),而不是应该妥善处理的事情(例如I/O故障),因为在处理它时缺乏强制执行。相反,尝试/捕捉逻辑上不可能的东西是很笨拙的。因此,相反,如果您想强制处理它,那么可以将RuntimeException以外的任何东西都子类化。@Samsvenbjorgchristiensen:“如果您正在编写一个关键库,检查异常有时会很有用[…],但在一般的应用程序开发中,依赖性成本大于好处”Martin的Clean Code第7章您所说的是,如果您想强制程序员以一种特殊的方式(即catch)处理它,请使用未经检查的异常(这是RuntimeException的子类)。这在本质上是不正确的,不是观点或风格的问题,因为正是RuntimeException及其子类不强制使用try/catch。我很感激这句话可能是一个很好的建议,但它说的不是同一件事。我同意在这种特殊情况下,未经检查的异常似乎是合适的,而IllegalArgumentException似乎是合理的。其他建议:我将把SortedMap封装在一个类中,并创建一个方法来添加一些东西——否则就必须记住在SortedMap中放置的任何地方都要检查重复的东西(而不是在封装SortedMap的类中只做一次)。或者扩展SortedMap并覆盖
put
方法-编写复制预防逻辑,然后委托给超类
put
方法。