空指针异常

时间:2010-08-20 10:51:25

标签: java android nullpointerexception

我有以下MapOverlay。以下行是抛出一个NullPointer,但我不明白为什么:S mapView.getProjection().toPixels(p, screenPts);任何人都可以帮助我吗?

    public class Mapview extends MapActivity {
GeoPoint p;
MapView mapView; 
MapController mc;

@Override
protected boolean isRouteDisplayed() {
 return false;
}
public int icount = 0;
MapController mapController;
MyPositionOverlay positionOverlay;
private LocationData tweets;
public int start = 0;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);



MapView myMapView = (MapView)findViewById(R.id.mapView);

myMapView.setSatellite(true);
myMapView.setStreetView(true);
myMapView.displayZoomControls(false);
mapController = myMapView.getController();

mapController.setZoom(17);
myMapView.setBuiltInZoomControls(true);

//Adding points here


//---Add a location marker---
MapOverlay mapOverlay = new MapOverlay();
List<Overlay> listOfOverlays = myMapView.getOverlays();
listOfOverlays.clear();
listOfOverlays.add(mapOverlay);        

myMapView.invalidate();

// Add the MyPositionOverlay
positionOverlay = new MyPositionOverlay();
List<Overlay> overlays = myMapView.getOverlays();
overlays.add(positionOverlay);


LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = (LocationManager)getSystemService(context);

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setSpeedRequired(false);
criteria.setCostAllowed(true);
String provider = locationManager.getBestProvider(criteria, true);


locationManager.requestLocationUpdates(provider, 2000, 10, locationListener);
Location location = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(location);

}


private final LocationListener locationListener = new LocationListener() {
 public void onLocationChanged(Location location) {
  updateWithNewLocation(location);
}

public void onProviderDisabled(String provider){
  updateWithNewLocation(null);
}

public void onProviderEnabled(String provider){ }
public void onStatusChanged(String provider, int status, 
                            Bundle extras){ }
 };

private void updateWithNewLocation(Location location) {
String latLongString ="";
TextView myLocationText;
myLocationText = (TextView)findViewById(R.id.myLocationText);
String addressString = "No address found";

if (location != null) {
     // Update my location marker
    positionOverlay.setLocation(location);

  // Update the map location.
  Double geoLat = location.getLatitude()*1E6;
  Double geoLng = location.getLongitude()*1E6;
  GeoPoint point = new GeoPoint(geoLat.intValue(), 
                                geoLng.intValue());

  mapController.animateTo(point);

  double lat = location.getLatitude();
  double lng = location.getLongitude();
  latLongString = "Lat:" + lat + "\nLong:" + lng;
  Global.lat = lat;
  Global.lng = lng;
  double latitude = location.getLatitude();
  double longitude = location.getLongitude();

  Geocoder gc = new Geocoder(this, Locale.getDefault());
  try {
    List<Address> addresses = gc.getFromLocation(latitude, 
                                                 longitude, 1);
    StringBuilder sb = new StringBuilder();
    if (addresses.size() > 0) {
      Address address = addresses.get(0);

      for (int i = 0; i < address.getMaxAddressLineIndex(); i++)
        sb.append(address.getAddressLine(i)).append("\n");

        sb.append(address.getLocality()).append("\n");
        sb.append(address.getPostalCode()).append("\n");
        sb.append(address.getCountryName());
    }
    addressString = sb.toString();
  } catch (IOException e) {}
} else {
  latLongString = "No location found";
}
}

class MapOverlay extends com.google.android.maps.Overlay
{
  @Override
  public boolean draw(Canvas canvas, MapView mapView, 
  boolean shadow, long when) 
  {
      super.draw(canvas, mapView, shadow);                   

      //---translate the GeoPoint to screen pixels---
      Point screenPts = new Point();
      mapView.getProjection().toPixels(p, screenPts);

      //---add the marker---
      Bitmap bmp = BitmapFactory.decodeResource(
          getResources(), R.drawable.marker);            
      canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);         
      return true;
 } 

 }
}

3 个答案:

答案 0 :(得分:2)

我看到GeoPoint p的声明,但没有实际初始化p的表达式。因此,将null传递给toPixels()方法可能是NPE的原因。

如果NPE消失,请尝试使用此代码检查:

  //---translate the GeoPoint to screen pixels---
  if (p == null) return false;
  Point screenPts = mapView.getProjection().toPixels(p, null);

(我不喜欢Java中的'out'参数,toPixels会为你创建点对象 并返回)

答案 1 :(得分:0)

好吧,似乎永远不会引用公共属性GeoPoint p 因此pointint为null。 也许你想在这一行中定义p:

GeoPoint point = new GeoPoint(geoLat.intValue(),                                 geoLng.intValue());

你应该找到要分配p的corredt位置,然后问题就解决了。

答案 2 :(得分:0)

您需要保留对稍后将使用的myMapView的引用。执行此操作的方法是使用strong属性将其声明为属性。