1

Android アプリケーションから、奇妙なエラー メッセージが表示されました: NullPointerException (最後の行のコード)。

public static Integer getDefaultCalendarId(Context context) {
    String calendarInSettings = PrefsHelper.getDefaultCalendar(context);
    Calendar calendar = PrefsHelper.getCalendarFromPrefKey(context, calendarInSettings);
    if (calendar == null || !calendar.canEventEdit()) {
        return calculateDefaultCalendar(context);
    }
    boolean isChecked = false;
    for (Calendar checkedCalendar : PrefsHelper.getCheckedCalendars(context)) {
        if (checkedCalendar.getId() == calendar.getId()) {
            isChecked = true;
            break;
        }
    }

    (1114 line) return isChecked ? calendar.getId() : calculateDefaultCalendar(context); // NullPointerException
}

Samsung GT-N7000 で例外が発生しました。

これはどのように起こりますか?

アップデート:

calculateDefaultCalendar は null を返すことができますが、getDefaultCalendarId の戻り値は整数 (null 可能) です。

スタックトレース:

java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx.trial/xxx.view.EventEditActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
at android.app.ActivityThread.access$600(ActivityThread.java:127)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4511)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:986)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:753)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at xxx.EventHelper.java.lang.Integer getDefaultCalendarId(android.content.Context)(SourceFile:1114)
at xxx.view.EventEditActivity.void onCreate(android.os.Bundle)(SourceFile:306)
at android.app.Activity.performCreate(Activity.java:4470)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
... 11 more
java.lang.NullPointerException
at xxx.EventHelper.java.lang.Integer getDefaultCalendarId(android.content.Context)(SourceFile:1114)
at xxx.view.EventEditActivity.void onCreate(android.os.Bundle)(SourceFile:306)
at android.app.Activity.performCreate(Activity.java:4470)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
at android.app.ActivityThread.access$600(ActivityThread.java:127)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4511)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:986)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:753)
at dalvik.system.NativeStart.main(Native Method)

更新 2

calculateDefaultCalendar:

private static Integer calculateDefaultCalendar(final Context context) {
    String account = PrefsHelper.getAccountName(context);
    if (account != null) {
        for (Calendar calendar : PrefsHelper.getCheckedCalendars(context)) {
            if (calendar.getOwnerAccount().equals(account) && calendar.canEventEdit()) {
                return calendar.getId();
            }
        }
    }

    for (Calendar calendar : PrefsHelper.getCheckedCalendars(context)) {
        if (calendar.canEventEdit()) {
            return calendar.getId();
        }
    }

    return null;
}

アップデート 3

エラーは定期的に繰り返されます:

製品 / アンドロイド版

LT26i_1257-3921 / 4.0.4

MK16i_1249-8137 / 4.0.4

SCH-I500 / 2.3.5

SCH-I500 / 4.0.4

4

3 に答える 3

3
return isChecked ? calendar.getId() : calculateDefaultCalendar(context);

calendar.getId()は返品しintないと思いますInteger。これはcalculateDefaultCalendar(context)、 を返す はInteger、最初に に自動ボックス化解除する必要がintあり、結果intは に自動ボックス化する必要があることを意味しますIntegerisCheckedが false でcalculateDefaultCalendar(context)返される場合null、結果は になりNPEます。たとえば、次の単純化された同等のコードを参照してください。

class N2 {
  public static void main(String args[])
  {
    System.out.println(check()); 
  }
  static Integer check()
  {
    return false ? 0 : fNull(); 
  }
  static Integer fNull() 
  {
    return null;
  }
}

auto-boxing関連する用語を検索するNullPointerExceptionと、ternary多くの同様のホットが表示されます。

于 2012-12-04T01:50:55.860 に答える
1

calender.getId()を返す場合は、int自動ボクシングの問題が発生しています。最も可能性の高い原因は の戻り値であるcalculateDefaultCalendar()ため、コンパイラがnull戻り値を自動ボックス化解除しようとしている可能性が最も高いです。calender.getId()これを修正するには、 withの戻り値を手動でボックス化するだけですInteger.valueOf(calendar.getId())。これにより、戻り値が としてボックス化され、Integerの戻り値calculateDefaultCalendar()が自動的にボックス化解除されなくなります。

于 2012-12-04T02:08:13.033 に答える
0

明白なことを述べると、これらの 1 つは null です。

  • calendar(削除され、以前にコードで正常に呼び出されました)

  • return fromgetId() (削除され、以前にコードで正常に呼び出された)

  • からの帰りcalculateDefaultCalendar

  • context(削除され、以前にコードで正常に呼び出されました)

calculateDefaultCalendar何らかの理由で null を返しているようです。これ以上支援する前に、そのコードが必要です。


OK、これで が得られたcalculateDefaultCalendarので、削除を続けることができます。あなたのコメントから、問題はこれらの2つの条件文が

if (calendar.getOwnerAccount().equals(account) && calendar.canEventEdit()) {
    return calendar.getId();
}

if (calendar.canEventEdit()) {
    return calendar.getId();
}

に評価されていませんtrue(そうでなければ、整数を返します)。したがって、次に行うことは、次のことを確認することです

  • accountnull ではない
  • canEventEdit()本当です

通常、NPE トレースはこのようなもので、非常に簡単です。何かが出力されるまでコードを逆方向に作業するだけNULLで、それがソースです。

于 2012-11-23T08:04:45.153 に答える