Java 在每个方法的开头检查NullPointerException

Java 在每个方法的开头检查NullPointerException,java,exception-handling,Java,Exception Handling,等待空指针异常发生是否更好 public void doSomething(String str) { Double val = Double.parseDouble(str); // Null pointer exception thrown here // Other code } 还是最好每次都检查,越早越好 public void doSomething(String str) { if (str == null) throw new N

等待空指针异常发生是否更好

public void doSomething(String str) {

    Double val = Double.parseDouble(str); // Null pointer exception thrown here


    // Other code
}
还是最好每次都检查,越早越好

public void doSomething(String str) {

    if (str == null)
        throw new NullPointerException(); // Null pointer exception thrown here

    Double val = Double.parseDouble(str);           // Other code
}

我建议使用assert子句。我认为他的回答最好地回答了你的问题


没有不同的代码。您应该抛出一些特定的异常。
有时null是合法值。

我会在您的方法中指出str是否可以为null,并使用
@Nullable
关键字。如果不允许str变量为null,则不要执行任何null检查。您应该在调用doSomething之前检查str是否为null。如果str允许为null,那么将其包装在null检查中,如果变量为null,则执行您认为合适的操作

public void doSomething(@Nullable String str) {

    if (str != null) {
        Double val = Double.parseDouble(str);

        // other code
    }
    else {
        // return or do something else
    }
}
或者


我不建议抛出空指针错误,除非应用程序在没有str变量的情况下无法继续。您希望捕获异常,以便应用程序不会崩溃,而不允许它们使应用程序崩溃。

有时通常会定义类似方法契约的内容

我是通过Spring
断言来执行此操作的:

org.springframework.util.Assert;
辅助验证参数的断言实用程序类。有用的 用于在运行时尽早、清晰地识别程序员错误

例如,如果公共方法的契约声明它没有 允许空参数,断言可用于验证该契约。 这样做清楚地表明发生了违反合同的行为,并且 保护类的不变量

通常用于验证方法参数而不是配置 属性,以检查通常是程序员错误的情况 而不是配置错误。与配置初始化不同 代码,在这种情况下,通常没有必要退回到默认值 方法

此类类似于JUnit的断言库。如果有争论 值被视为无效,将引发IllegalArgumentException (通常)

就你而言:

public void doSomething(String str) {
   Assert.notNull(str);

   Double val = Double.parseDouble(str); // Nullpointer not possible here if the contract was not injured.


        // Other code
}
如果任何开发人员传递空值,则契约未完全填充,并引发
IlligalArgumentException

易于通过Junit进行测试:

  /**
   * Check case that passed string is null.
   */
  @Test(expected = IllegalArgumentException.class)
  public void testDoSomething_StringIsNull() {
    mClassUnderTest.doSomething(null);
  }

在这种情况下,它没有多大区别,因为
parseDouble
将抛出一个NPE。在更一般的情况下,自Java 7以来,您可以使用:

Objects.requireNonNull(str); //throws NPE if str is null
//rest of the code

不错。我不知道。
Objects.requireNonNull(str); //throws NPE if str is null
//rest of the code