【问题标题】:When to check for null's?何时检查空值?
【发布时间】:2011-06-03 17:40:52
【问题描述】:

我是否应该检查需要在构造函数中有效的值是否传递了空值?换句话说,我应该让类在它获得无效值时抛出,还是应该让它一直存在,直到它尝试对它做某事,让运行时引发异常?

我想如果传递一个空值是一个错误,我应该在构造函数中这样对待它吗?

【问题讨论】:

  • 你应该尽早尝试失败

标签: java


【解决方案1】:

基本规则: 如果您的构造函数不能保证给定参数的稳定和有效状态,则抛出异常!

因此,如果您需要值为 != null 来获得有效的对象状态,请立即检查并抛出异常。你还要什么时候做?

【讨论】:

    【解决方案2】:

    我总体上同意 duffymo,但这也取决于您何时需要使用该潜在的空值。如果构造函数中需要它,那么是的,你应该在那里抛出一个 IllegalArgumentException 。但是,如果稍后才需要该值(例如,在另一种方法中),那么您可以(并且可能应该)将 null 检查推迟到该点。

    【讨论】:

      【解决方案3】:

      请参阅this StackOverflow post 和有关 Fail Early 原则的说明。如果传递一个空值是一个错误,你应该在构造函数中这样对待它。

      【讨论】:

      • 除了早失败,还应该从自洽的角度来思考。如果对象在从 null 构造后会处于不一致状态,那么无论如何,不​​要允许构造发生。班级的工作是确保对象始终保持自我一致。如果您的所有对象在任何时候都是自一致的,那么您就拥有一个稳定、可预测的代码库已经走了很长一段路。
      【解决方案4】:

      我愿意。如果合同中包含非空参数,请务必通过 IllegalArgumentException 或断言通知用户。

      我选择“最小惊喜”的方式。

      【讨论】:

      • NullPointerException 会更合适。而 assert 主要只是用于调试目的。
      • 我认为 IllegalArgumentException 也同样有效。
      • 由于 null 是一个非法参数,它会很好,但 NullPointerException 更具体。
      • 不,我倾向于使用 IAE,而不是 NPE。后者具有误导性——它没有被取消引用。
      • IllegalArgument 是最具描述性的。你是说:嘿,这里不允许 null 。此外,IllegalArgument 通常用于表示合同违约,而 nullpointer 则不是。
      【解决方案5】:

      如果在传递 null 时无法继续进行而不出现错误,则在构造函数中尽早捕获它。

      如果你还能做点什么,那就等着吧。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 2020-07-22
        • 1970-01-01
        • 2013-05-16
        • 2014-05-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多