在每个方法

时间:2015-11-19 10:49:50

标签: 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 NullPointerException(); // Null pointer exception thrown here

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

5 个答案:

答案 0 :(得分:1)

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

Avoiding != null statements

答案 1 :(得分:1)

我会在你的方法中指出str是否可以为null @Nullable关键字。如果您不允许str变量为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
    }
}

或..

public void doSomething(@Nullable String str) {

    if (str == null) {
        return;
    }

    Double val = Double.parseDouble(str);

    // other code

}

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

答案 2 :(得分:1)

在这种情况下,由于parseDouble会抛出NPE,因此并没有太大的区别。在更一般的情况下,从Java 7开始,您可以使用:

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

答案 3 :(得分:0)

没有不同的代码。你应该抛出一些特殊的例外。 有时候null是合法的价值。

答案 4 :(得分:0)

有时通常会定义类似方法合同的内容。

我是通过Spring Asserts执行此操作的:

org.springframework.util.Assert;
  

Assertion实用程序类,可帮助验证参数。有用   用于在运行时尽早识别程序员错误。

     

例如,如果公共方法的合同声明它没有   允许null参数,Assert可用于验证该合同。   这样做可以清楚地表明合同违规发生时   保护班级的不变量。

     

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

     

这个类类似于JUnit的断言库。如果是一个论点   如果value被视为无效,则抛出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);
  }