0
    Character c = null;
    if (c != 'P') c = 'G';

これが結果で私を殺している簡単なコードです。条件の代わりに、NullPointerExceptionエラーが発生します。nullですが!='P'であり、条件が満たされている必要があります。追加の検証の問題に苦労していますc!=条件「if」ではnull。あるべきですか?エラーの代わりに比較を行う方法はありますか?したがって、すべてのコードがこれらの不要なチェックでいっぱいであることがわかります。

4

4 に答える 4

8

ナンセンの答えを少し拡張すると、コードは次のようになります。

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。ではなくタイプである必要 がありますか?本当にそうする場合は、次を使用する必要があります。cCharacterchar

if (c == null || c != 'P')
于 2012-09-29T17:30:03.530 に答える
7

オートボクシングを使用している場合、nullのラッパータイプCharacterは暗黙的にプリミティブcharに変換されます。それはNPEが起こっているときです。

于 2012-09-29T17:28:52.567 に答える
1

プリミティブと比較して異議を唱えようとしています。Java は互換性のある型の 2 つの要素しか比較できないため、Characterwithのインスタンスを作成しません'P'が、変数cをに変換しようとしますcharが、それは であるため実行できませんnull

于 2012-09-29T17:29:31.200 に答える
0

別の解決策は、' Yoda Conditional ' 構文を使用することです。

Character c = null;
if (!new Character('P').equals(c)) c = new Character('G');

null.equals()これは、NullPointerException が無効であるためスローされないことを意味しますが、 new Character('P')null になることはありません。

于 2012-09-29T18:24:52.103 に答える