0

我在以下代码中尝试调试/解决空指针异常时遇到问题。我正在尝试将 waypointCursor 初始化为 null 并且我需要稍后在代码中检查它是否等于 null。这样做虽然给了我一个 NullPointerException。我需要帮助来解决它。这是以下代码和详细信息。

这是调用该方法的代码:

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));
  }

这是发生 NullPointerException 的 StatisticsCalculator 中的代码:

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() )

它不喜欢在这一行将 waypointsCursor 设置为 null :

Cursor waypointsCursor = null;

就在上面的 try 语句之上。我确实需要将其设置为 null,以便我可以检查这一行上的 waypointsCursor 是否等于 null:在 finally 语句中的 if( waypointsCursor != null )。

这是 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)

任何帮助,将不胜感激。

4

1 回答 1

0

如果查询没有要返回的结果,则返回值为 null。在将查询用作游标之前检查查询的返回值是否不为空是一种很好的做法。因此,在您的情况下,您可以在查询后立即获得以下内容

if(waypointsCursor == null)
    return null;

或者如果您不想返回,则将随后的代码包装在 if 块中

if(waypointsCursor == null){
    if( waypointsCursor.moveToLast() )
    ...
 }
于 2013-04-12T20:11:23.377 回答