2013-04-12 15 views
0

我遇到空指針異常的問題,我試圖在下面的代碼中進行調試/解決。我試圖初始化waypointCursor爲空,我需要檢查它是否等於null以後在代碼中。儘管這樣做是給了我一個NullPointerExeception。我需要幫助,試圖解決它。以下是以下代碼和詳細信息。NullPointerException - Android中的數據庫光標 - 解決方法

這裏是調用方法的代碼:

private void displayCursor(Cursor tracksCursor) 
{ 
    UnitsI18n mUnits; 
    mUnits = new UnitsI18n(this, new UnitsI18n.UnitsChangeListener() 
    { 
    @Override 
    public void onUnitsChange() 
    { 
     //Do Nothing 
    } 
    }); 

    Log.i(TAG, "TRACKS CONTENT URI:"+Tracks.CONTENT_URI); 
    StatisticsCalculator stats = new StatisticsCalculator(this, mUnits, this); 

    //UNCOMMENT THIS ONCE I FIGURE OUT WHAT IS GOING ON 
    if (Tracks.CONTENT_URI != null) { 
     stats.updateCalculations(Tracks.CONTENT_URI); 
     //stats.updateCalculations(Uri.withAppendedPath(Tracks.CONTENT_URI, TRACKURI)); 
    } 

這裏是StatisticsCalculator的代碼,其中所述的NullPointerException正在發生的事情:

public void updateCalculations(Uri trackUri) 
{ 
    mStarttime = -1; 
    mEndtime = -1; 
    mMaxSpeed = 0; 
    mAverageActiveSpeed = 0; 
    mMaxAltitude = 0; 
    mMinAltitude = 0; 
    mAscension = 0; 
    mDistanceTraveled = 0f; 
    mDuration = 0; 
    long duration = 1; 
    double ascension = 0; 

    ContentResolver resolver = mContext.getContentResolver(); 

    Cursor waypointsCursor = null; 
    try 
    { 
    waypointsCursor = resolver.query( 
      Uri.withAppendedPath(trackUri, "waypoints"), 
      new String[] { "max (" + Waypoints.TABLE + "." + Waypoints.SPEED + ")" 
         , "max (" + Waypoints.TABLE + "." + Waypoints.ALTITUDE + ")" 
         , "min (" + Waypoints.TABLE + "." + Waypoints.ALTITUDE + ")" 
         , "count(" + Waypoints.TABLE + "." + Waypoints._ID + ")" }, 
      null, null, null); 
    if(waypointsCursor.moveToLast()) 
    { 
     mMaxSpeed = waypointsCursor.getDouble(0); 
     mMaxAltitude = waypointsCursor.getDouble(1); 
     mMinAltitude = waypointsCursor.getDouble(2); 
     long nrWaypoints = waypointsCursor.getLong(3); 
     waypointsText = nrWaypoints + ""; 
    } 
    waypointsCursor.close(); 
    waypointsCursor = resolver.query( 
      Uri.withAppendedPath(trackUri, "waypoints"), 
      new String[] { "avg (" + Waypoints.TABLE + "." + Waypoints.SPEED + ")" }, 
      Waypoints.TABLE + "." + Waypoints.SPEED +" > ?", 
      new String[] { ""+Constants.MIN_STATISTICS_SPEED }, 
      null); 
    if(waypointsCursor.moveToLast()) 
    { 
     mAverageActiveSpeed = waypointsCursor.getDouble(0); 
    } 
    } 
    finally 
    { 
    if(waypointsCursor != null) 
    { 
     waypointsCursor.close(); 
    } 
    } 

的代碼在StatisticsCalculator類中的線(第75行)是這行代碼:

if(waypointsCursor.moveToLast()) 

它不喜歡e在此行上將路點設置等於零:

Cursor waypointsCursor = null; 

正好在上面的try語句上方。我確實需要將它設置爲空,但是我可以檢查此行上的waypointsCursor是否等於null: if(waypointsCursor!= null) 在finally語句中。

這裏是logcat的輸出:

04-12 18:29:16.795: I/OGT.TrackList(6115): TRACKS CONTENT URI:content://com.android.gpstracker/tracks 
04-12 18:29:16.795: E/OGT.GPStrackingProvider(6115): Unable to come to an action in the query uri: content://com.android.gpstracker/tracks/waypoints 
04-12 18:29:16.795: D/AndroidRuntime(6115): Shutting down VM 
04-12 18:29:16.807: W/dalvikvm(6115): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 
04-12 18:29:16.915: E/AndroidRuntime(6115): FATAL EXCEPTION: main 
04-12 18:29:16.915: E/AndroidRuntime(6115): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.gpstracker/com.polaris.epicriders.Rides.RidesActivity}: java.lang.NullPointerException 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.os.Looper.loop(Looper.java:137) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at dalvik.system.NativeStart.main(Native Method) 
04-12 18:29:16.915: E/AndroidRuntime(6115): Caused by: java.lang.NullPointerException 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at com.android.gpstracker.actions.utils.StatisticsCalculator.updateCalculations(StatisticsCalculator.java:75) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at com.polaris.epicriders.Rides.RidesActivity.displayCursor(RidesActivity.java:901) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at com.polaris.epicriders.Rides.RidesActivity.displayIntent(RidesActivity.java:880) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at com.polaris.epicriders.Rides.RidesActivity.access$6(RidesActivity.java:832) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at com.polaris.epicriders.Rides.RidesActivity$8.onCheckedChanged(RidesActivity.java:198) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.widget.RadioGroup.setCheckedId(RadioGroup.java:174) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.widget.RadioGroup.access$600(RadioGroup.java:54) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.widget.RadioGroup$CheckedStateTracker.onCheckedChanged(RadioGroup.java:358) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.widget.CompoundButton.setChecked(CompoundButton.java:129) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at com.polaris.epicriders.Rides.RidesActivity.onCreate(RidesActivity.java:222) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.app.Activity.performCreate(Activity.java:5104) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
04-12 18:29:16.915: E/AndroidRuntime(6115):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 

任何幫助,將不勝感激。

+0

安置自己的ContentProvider的'查詢之後()'方法,所以我們可以看到它爲什麼返回null。 – Sam

+0

query()方法是屬於Android SDK的ContentResolver類的一部分。 – user268397

回答

0

如果查詢沒有返回結果,則返回值將爲空。在將其用作遊標之前檢查查詢的返回值是否爲空是一種好的做法。所以你的情況,你可以有以下查詢

if(waypointsCursor == null) 
    return null; 

,或者如果你不想回,然後再包隨後的代碼在if塊

if(waypointsCursor == null){ 
    if(waypointsCursor.moveToLast()) 
    ... 
}