【问题标题】:Checked or Unchecked Exception [duplicate]已检查或未检查的异常[重复]
【发布时间】:2009-08-03 20:35:15
【问题描述】:

可能重复:
When to choose checked and unchecked exceptions

你好!

所以,对于何时抛出已检查或未检查的异常,我仍然感到很舒服。我想知道其他人认为在这种情况下最合适的是什么:

class Correlation<T>
{
    private final T object1, object2;
    private final double correlationCoefficient;

    public Correlation(T object1, T object2, double correlationCoefficient)
    {
        if(Math.abs(correlationCoefficient) > 1.0 || (object1.equals(object2) && correlationCoefficient != 1.0))
            throw new IllegalArgumentException();

        this.object1 = object1;
        this.object2 = object2;
        this.correlationCoefficient = correlationCoefficient;
    }
}

因此,在这种情况下,我想抛出一个运行时异常,因为我无法从用户传入错误数据的情况中轻松恢复。我想事先指出,我无法控制传入的数据。如果可以的话,我会创建一个接口来保证构造函数中的条件为真。但是,对于已经计算过的相关性来说,这是一个方便的类,所以我必须相信用户提供了准确的信息。

好的,让我知道你们的想法!

【问题讨论】:

  • 您对 IllegalArgumentException(运行时异常)的使用是有效的,因为参数是 illega(根据构造函数的期望(应记录在 JavaDocs 中))。

标签: java exception runtime checked-exceptions


【解决方案1】:

我认为这是正确的回答。您正在有效地进行障碍断言,即障碍检查,如果它们是错误的,您将拒绝创建实体。我会用一个 java 文档记录你可以抛出一个 IllegalArgumentException,但除此之外,它看起来是正确的。

Joshua Block 提供了一些关于已检查和未检查异常的重要信息。基本前提是,除非您绝对希望有人检查异常,否则您应该抛出未经检查的异常。以这种方式思考可能会使一些编码和返回值复杂化,但通常它会使代码更清晰、更高效。对例外情况使用例外,事情对你来说会更好。

只要我的 2 美分。


编辑

为了清楚起见,这里有一些类似于你应该拥有的 java 文档:

/**
 * <Something describing constructor, and what it does, ending with a period.>
 *
 * @param parameter <Describe the parameter - do one for each parameter of the constructor,
 *     and note which values may be illegal for that particular parameter.>
 * @throws IllegalArgumentException <the case for the illegal argument exception.>

【讨论】:

    【解决方案2】:

    在我看来,答案取决于:

    • 您希望调用者能够正常恢复吗?
    • 此 API 是供公众使用还是内部使用?

    有人会告诉你,你永远不应该使用受检异常。这纯粹是主观的。

    【讨论】:

      【解决方案3】:

      您应该始终在您的例外中包含解释性文字。在这种特殊情况下,您甚至可以考虑进行两项检查:

          if(Math.abs(correlationCoefficient) > 1.0)
                  throw new IllegalArgumentException("abs(correlationCoefficient) > 1.0 - " + correlationCoefficient);
          if((object1.equals(object2) && correlationCoefficient != 1.0))
                  throw new IllegalArgumentException("object1==object2, but correlationCoefficient != 1.0, " + correlationCoefficient);
      

      这使得那些真正看到堆栈跟踪的人能够确定确切的原因,而无需仔细查看代码。一个给定的异常应该只由一个条件触发,而不是几个,因为你不能确定发生了什么。还包括所有必要的信息,因为如果错误情况无法在测试场景中重现,这可能是至关重要的。

      【讨论】:

      • 是的,总是有异常消息解释异常并包含导致异常的值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多