为什么在这个方法调用中有NullPointerException?

时间:2017-06-08 14:59:02

标签: java nullpointerexception

当我调用这样的方法时:

"daysOfWeek": ["SUNDAY"]

为什么会有int value1; Integer value2 = null; setValue(value2); private void setValue(int value) { value1 = value; }

5 个答案:

答案 0 :(得分:2)

当前答案中未提及的情况是形式参数类型是否是原始的:

void setValue(int a) {
  // ...
}

可以使用参数null调用此方法,因为编译器将尝试自动取消装箱值。有效:

setValue(null);

将被调用为:

setValue(((Integer) null).intValue());

但是,NPE总是会失败,因为你不能取消引用空值。

但请注意,NPE不会发生,因为null传递给方法,而是因为评估了传递的值。差异很微妙,但很重要。

任何值得使用的IDE都应将此标记为问题。

答案 1 :(得分:0)

是的,如果setValue()确实访问了这样的对象:

void setValue(Long lung) {
    this.val = lung.intValue();
}

因为它试图取消引用null。并且,如果setValue()确实像这样对待对象:

void setValue(Long lung) {
    this.val = Optional.ofNullable(lung)
                       .map(Long::intValue)
                       .orElse(0L) ;
}

因为它知道如何处理null

重点是:如果接收null参数的方法在方法体内取消引用它,或者将其传递给某个方法,NullPointerException将被抛出否则不会。

答案 2 :(得分:0)

当您尝试在Null Pointer Exception引用上调用方法时,会发生

null。因此,当您调用该方法以及您使用该参数调用某个方法的任何地方时,您将获得Null Pointer Exception,否则如果您将其传递给JAVA或其他人的API,并且如果内部发生相同的事情那么你也会跳进NPE。因此,debug您的代码可以正确找到可能获得Exception的位置并进行空检查。

void setValue(Object value) {

     // case : 1
     int i = (Integer) value;

     // case : 2
     int i = value.toString().length();

     // case : 3
     value.getSomethingElse();

}

这些是您将获得NPE的可能情况。但是,如果您只是调用此方法来简单地设置一些派生属性,那么它很好,因为null可以分配给任何派生属性。但是如果在将该属性设置为null后调用该属性上的任何方法,那么结果将是相同的。

class Foo {

     private String entity;
     public void setEntity(String entity) {
          this.entity = entity;
     }
     public String getEntity() {
          return entity;
     }
}
class FooManager {

      public static void main(String[] arg) {
            Foo foo = new Foo();
            foo.setEntity(null);
            System.out.println(foo.getEntity().length());   //NPE
      }
}

答案 3 :(得分:0)

当JVM期望有效的对象引用但得到NullPointerException时,通常会抛出null。一个非常常见的具体情况是,当您设置对null的引用,然后尝试调用方法或访问该引用上的字段时。

根据您提供的信息,无法判断您的代码是否会引发异常。

如果setter只是分配一个引用,它不会立即抛出任何东西,因为你几乎可以将null分配给任何非原始的东西。这并不是说当您尝试访问刚刚设置的对象时,您将不会获得异常。

如果setter直接对您传入的引用执行任何类型的操作,而不先检查它是否为null,则可能会出现异常。但是,最有可能的是,如果setter写得很好,它会执行一些检查并在盲目使用传入的引用之前采取适当的操作。

答案 4 :(得分:0)

每当您尝试访问null-Reference上的内容时,都会抛出NullPointerException。

我们说我们有这种方法:

public static String test(Object obj)
{
    return obj.toString();
}

我们这样调用它:

test(new Object());

一切都会好起来的。

但是如果我们用null调用方法:

test(null);

将抛出NullPointerException。

看看StackTrace,你会看到NullPointerException被抛出这一行:

return obj.toString();

那是因为我们试图调用Method" toString"在null-Reference。

所以我们看到,没有给Method一个null-Parameter,但是在null-Reference上调用一个方法会导致NullPointerException。某些方法检查参数是否为null并对其执行特殊操作。它通常甚至非常有用。但是大多数方法都要求参数不为空。