Character c = null;
if (c != 'P') c = 'G';
これが結果で私を殺している簡単なコードです。条件の代わりに、NullPointerExceptionエラーが発生します。nullですが!='P'であり、条件が満たされている必要があります。追加の検証の問題に苦労していますc!=条件「if」ではnull。あるべきですか?エラーの代わりに比較を行う方法はありますか?したがって、すべてのコードがこれらの不要なチェックでいっぱいであることがわかります。
Character c = null;
if (c != 'P') c = 'G';
これが結果で私を殺している簡単なコードです。条件の代わりに、NullPointerExceptionエラーが発生します。nullですが!='P'であり、条件が満たされている必要があります。追加の検証の問題に苦労していますc!=条件「if」ではnull。あるべきですか?エラーの代わりに比較を行う方法はありますか?したがって、すべてのコードがこれらの不要なチェックでいっぱいであることがわかります。
ナンセンの答えを少し拡張すると、コードは次のようになります。
Character c = null;
char tmp = c.charValue();
if (tmp != 'P')
{
c = Character.valueOf('G');
}
これは、JLS のセクション 15.21.1によるものです(==
および!=
)。
等価演算子のオペランドが両方とも数値型である場合、または一方が数値型で他方が数値型に変換可能 (§5.1.8) である場合、オペランドに対してバイナリ数値昇格が実行されます (§5.6.2)。
バイナリ数値プロモーションは、値セットの変換 (§5.1.13) を実行し、ボックス化解除の変換 (§5.1.8) を実行する場合があることに注意してください。
.を取得している理由がわかると思いますNullPointerException
。ではなくタイプである必要 がありますか?本当にそうする場合は、次を使用する必要があります。c
Character
char
if (c == null || c != 'P')
オートボクシングを使用している場合、nullのラッパータイプCharacterは暗黙的にプリミティブcharに変換されます。それはNPEが起こっているときです。
プリミティブと比較して異議を唱えようとしています。Java は互換性のある型の 2 つの要素しか比較できないため、Character
withのインスタンスを作成しません'P'
が、変数c
をに変換しようとしますchar
が、それは であるため実行できませんnull
。
別の解決策は、' Yoda Conditional ' 構文を使用することです。
Character c = null;
if (!new Character('P').equals(c)) c = new Character('G');
null.equals()
これは、NullPointerException が無効であるためスローされないことを意味しますが、 new Character('P')
null になることはありません。