当我调用这样的方法时:
"daysOfWeek": ["SUNDAY"]
为什么会有int value1;
Integer value2 = null;
setValue(value2);
private void setValue(int value) {
value1 = value;
}
?
答案 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并对其执行特殊操作。它通常甚至非常有用。但是大多数方法都要求参数不为空。