序章
私はこの問題に数分立ち往生していました。だから、それはおそらく他の誰かを助けるだろうし、それは楽しいバグです. しかし、最初の質問を解決すると、別の質問に移動しました。
最初のパズルの質問:
次のコードを検討してください。
public void setValue(ValueWrapper valueWrapper) {
if (anotherValueWrapper == null) {
anotherValueWrapper = new AnotherValueWrapper();
}
anotherValueWrapper.setValue(valueWrapper == null ? null : valueWrapper.getValue());
}
事実 :
- このコードはコンパイルされます
- ゲッターとセッターは標準です(フィールドを返すか設定するだけのコードはありません)
問題
実行中に、コードが失敗して null ポインター例外を返すケースが 1 つあります。
最初のパズルの質問は次のとおりです。このコードが NullPointerException になるのはいつですか?
最初の質問が見つからない場合はネタバレになるので、2 番目の質問は見ないでください。
2 番目の質問
わかりました、あなたはそれを見つけます(または多分見つけないでしょう):問題は、AnotherValueWrapperが次のように書かれているときです:
public class AnotherValueWrapper {
private long value;
public long getValue() { return value; }
public void setValue(long value) { this.value = value; }
}
および ValueWrapper:
public class ValueWrapper {
private Long value;
public Long getValue() { return value; }
public void setValue(Long value) { this.value = value; }
}
2 番目の質問は次のとおりです。
私が書く場合:
anotherValueWrapper.setValue(null);
また
anotherValueWrapper.setValue(valueWrapper == null ? "test": valueWrapper.getValue());
if は(オブジェクト)anotherValueWrapper.setValue
ではなくプリミティブ (long) を取るため、コンパイルされません。Long
しかし、このコードはコンパイルされます:
anotherValueWrapper.setValue(valueWrapper == null ? null : valueWrapper.getValue());
なんで ?