0

カスタムSimpleCursorAdapterで、ステータス文字列を比較しようとしていますが、紛らわしい結果になっています。

私の文字列はこのようにカーソルから初期化されます(そしてtoast、期待値が含まれていることを確認しました)。

String visitStatus = cursor.getString(cursor.getColumnIndex(CallData.COLUMN_VisitStatus));

visitStatusは、null、Open、Canceled、またはCompleteのいずれかになります。

visitStatusを「引用符で囲まれた任意の文字列」と比較しようとすると、アプリがNullPointerExceptionでクラッシュします。nullと比較した場合にのみ、何も得られません-それは私には役に立ちません

if(visitStatus.equals(null)) // the app crashes with a NullPointerException
if(visitStatus == null) // doesn't crash
if(visitStatus != null) // doesn't crash
if(visitStatus == "Complete") // doesn't crash or do anything
if(visitStatus.equals("Complete")) // the app crashes with a NullPointerException.

基本的に、私はnullと比較することができますが、それが機能するはずのない方法でのみです。「Open」や「Complete」などの実際の文字列と比較することはできません。

私はこれに少し気が狂いそうです、そして私のC#コンフォートゾーンをひどく逃しています。この特定のアクティビティは、listfragments、contentproviders、customadapters、viewpagers、pagertitlestrips、およびlistrowxmlテンプレートの悪夢です。

半分!

4

2 に答える 2

4

これはvisitStatusですnull。そのメソッドにアクセスしようとすると、クラッシュします。(つまり、、visitString.equals()などvisitString.length()、すべてがクラッシュします。

ただし、等式演算子(==)は、そのnull両側のパラメーターをサポートします。(つまり、if (null == null)有効なチェックです。)

次のように確認する必要があります。

if (visitStatus != null && visitStatus.equals("Complete")) {
    // ...
}

nullまたは、パラメータをサポートする「Yoda構文」(後方チェック)を実行できます。

if ("Complete".equals(visitStatus)) {
    // ...
}

また、最後の注意:を使用して文字列の内容を比較することはできません==(のように、またはを実行することはできませ"a" == new String("a")visitString == "Complete")。詳細な説明については、このQ&Aスレッドを参照してください。

于 2012-12-13T18:27:13.067 に答える
0

Stringを使用して比較する必要があります.equals()

NullPointerException原因でvisitStatusnull

于 2012-12-13T18:26:19.510 に答える