【问题标题】:Handling exception thown by many methods, overriden in many classes处理许多方法抛出的异常,在许多类中被覆盖
【发布时间】:2015-11-15 01:03:34
【问题描述】:

您好,我正在做一个项目。 我正在覆盖项目中大约 100 个类中的一个方法,并且我正在使用映射来填充一些键和值并返回映射。现在 map.put() 方法抛出 4 个异常:Null、UnsupportedOperation、IllegalArgument 和 ClassCast 异常。 所以我应该处理所有这些还是不处理。显然我应该,是吗?

那么问题是我应该在每个被覆盖的方法(100 个类)中处理这些,还是只在方法中添加 throws 关键字并处理我调用这些方法的位置?

什么是更好的做法?这是一个非常关键的项目,不应该不处理任何例外,否则它可能会导致许多其他事情崩溃。告诉我看现实生活中的场景。

【问题讨论】:

    标签: java exception-handling try-catch overriding throws


    【解决方案1】:

    一般来说,您应该捕获一个可以添加一些价值的异常。在您实际上不知道如何处理的情况下捕获异常没有用,而且可能只会掩盖问题。

    由于Map 定义了您应该支持的行为,因此检查异常不是一个选项。

    由于大多数错误是编码错误,我会在较高级别处理它们,因为您无法在运行时轻松采取纠正措施,即修复是修复代码,这样就不会发生这种情况。

    【讨论】:

      【解决方案2】:

      首先,Java中重写方法时不能修改throw子句,四个异常都是RuntimeException,不需要throw子句。

      其次,在考虑如何处理之前,了解何时抛出异常很重要。并且应该忽略一些无论输入是什么都永远不会发生的异常。因此,答案取决于您在代码中使用的Map 的实现。

      如果您使用HashMap,则不会抛出四个异常,因此您可以忽略它们。

      如果您使用TreeMap,如果您将null 值作为键,NullPointerException 将发生,当您的键不是当前在键中使用的Comparable<T> 的实例时,ClassCastException 将发生已经在地图上。并且您应该确定某些覆盖方法的某些输入会导致这两个异常。如果是这样,请通过抛出自定义异常来处理它们,就像其他答案所说的那样是首选。否则你也可以忽略它们。

      【讨论】:

      • 我正在使用linkedhashmap,所以我可以跳过吗?我使用这个的目的是我希望不改变添加的顺序所以你有什么建议?
      • @user2696258 是的,它从HashMap 继承了put 方法,所以不会抛出异常。
      【解决方案3】:

      最好写一个自定义异常并抛出它。在捕获它时设置正确的消息。 所以最终会有一个你的方法需要抛出的异常。

      【讨论】:

        【解决方案4】:

        一个好的实践是早扔,晚接

        看看这个question

        【讨论】:

          【解决方案5】:

          好吧,如果所有这些方法都是从同一点(或一组点)调用的,那么传播从它们抛出的异常是一个明显的解决方案(在方法声明中添加 throws)然后处理这些异常在调用方法中。这样,您就有了一个点来管理您的异常处理案例。
          另外,所有抛出的异常都有特定的含义(就像你说你想处理从 map.put() 得到的那些),请考虑使用自定义异常。这里有一些指导方针:Guidelines

          【讨论】:

            猜你喜欢
            • 2013-01-07
            • 2023-03-27
            • 2023-03-21
            • 1970-01-01
            • 1970-01-01
            • 2018-11-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多