【问题标题】:Throwing a NPE at the start of method for error checking在错误检查方法的开头抛出 NPE
【发布时间】:2013-04-12 10:28:01
【问题描述】:

所以我正在准备采访,并且在 Gayle Laakmans 职业杯视频中,一个人正在编写一个简单的方法,该方法接受一个数组并对其进行处理。她提到他缺乏错误检查,所以他在这一行中添加如下:

public int max(int[] array) {
    if (array == null)
        throw new NullPointerException();

    //method body

}

像这样手动抛出 NPE 异常是否正确,这个异常无论如何都会在方法体中抛出,因为它会在某些时候使用数组引用。

我可以看到的一个可能的优点是,它将输入无效与方法逻辑无效分开,并以某种方式创建空引用。否则会有点混乱,也许 IllegalArgumentException 会更好?

【问题讨论】:

    标签: exception error-handling nullpointerexception


    【解决方案1】:

    一进入方法就抛出NullPointerException没有什么问题,而不是在一些处理完成后等待检测它。如果该方法将失败,它还不如快速失败。

    Joshua Bloch 的 Effective Java 建议在这种情况下将 NullPointerException 扔到 IllegalArgumentException 之上(第 60 条:支持使用标准异常)。

    如果调用者在某个参数中传递了null,而该参数被禁止为空值,则约定会抛出NullPointerException,而不是IllegalArgumentException

    IllegalArgumentException在传入非法的非空值时应该抛出。

    【讨论】:

      【解决方案2】:

      还可以看看java自带的实用类java.util.Objects

      public static <T> T requireNonNull(T obj,
                     String message)
      

      检查指定的对象引用是否不为空,如果是则抛出自定义的 NullPointerException。该方法主要用于在具有多个参数的方法和构造函数中进行参数验证,如下所示:

       public Foo(Bar bar, Baz baz) {
           this.bar = Objects.requireNonNull(bar, "bar must not be null");
           this.baz = Objects.requireNonNull(baz, "baz must not be null");
       }
      
      • 类型参数:
        T - 引用的类型

      • 参数:
        obj - 检查无效性的对象引用
        消息 - 在出现 NullPointerException 的情况下使用的详细消息被抛出

      • 如果不为空,则返回:
        obj

      • 抛出:
        NullPointerException - 如果 obj 为 null

      来自https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html

      结论

      您是否使用此实用程序类是另一个问题,但它明确表明,Java 语言背后的团队打算将 NullPointerException 用于这些目的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-21
        • 1970-01-01
        • 1970-01-01
        • 2021-04-20
        • 2021-01-19
        • 1970-01-01
        • 2015-03-08
        相关资源
        最近更新 更多