2013-04-12 13 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()) 
    ... 
}