介绍
我被困在这个问题上几分钟。所以,它可能会帮助其他人,这是一个有趣的错误。但是解决第一个问题让我想到了另一个问题。
第一个谜题:
考虑以下代码:
public void setValue(ValueWrapper valueWrapper) {
if (anotherValueWrapper == null) {
anotherValueWrapper = new AnotherValueWrapper();
}
anotherValueWrapper.setValue(valueWrapper == null ? null : valueWrapper.getValue());
}
事实 :
- 这段代码编译
- getter 和 setter 是标准(没有比返回字段或设置更多的代码)
问题
在执行过程中,有一种情况是代码失败并返回空指针异常。
第一个难题是:这段代码什么时候会导致 NullPointerException?
不要看第二个问题,因为如果你没有找到第一个问题,那就是剧透。
第二个问题
好的,你找到它(或者可能没有):问题是当 AnotherValueWrapper 是这样写的:
public class AnotherValueWrapper {
private long value;
public long getValue() { return value; }
public void setValue(long value) { this.value = value; }
}
和价值包装器:
public class ValueWrapper {
private Long value;
public Long getValue() { return value; }
public void setValue(Long value) { this.value = value; }
}
第二个问题来了:
如果我写:
anotherValueWrapper.setValue(null);
或者
anotherValueWrapper.setValue(valueWrapper == null ? "test": valueWrapper.getValue());
if 由于anotherValueWrapper.setValue
需要原始(长)而不是Long
(对象)而无法编译。
但是这段代码编译:
anotherValueWrapper.setValue(valueWrapper == null ? null : valueWrapper.getValue());
为什么 ?