在Android中使用逐项覆盖时为空指针

在Android中使用逐项覆盖时为空指针,android,maps,itemizedoverlay,Android,Maps,Itemizedoverlay,您好,我正在尝试使用逐项叠加在地图上绘制一组晶格度和经度。我收到以下错误。可能是什么问题 > 这是我的HelloItemizedOverlay课程 package com.rahul.besttracker; import java.util.ArrayList; import android.app.AlertDialog; import android.content.Context; import android.graphics.drawable.Dr

您好,我正在尝试使用逐项叠加在地图上绘制一组晶格度和经度。我收到以下错误。可能是什么问题

>

这是我的HelloItemizedOverlay课程

package com.rahul.besttracker;

    import java.util.ArrayList;

    import android.app.AlertDialog;
    import android.content.Context;
    import android.graphics.drawable.Drawable;

     import com.google.android.maps.ItemizedOverlay;
    import com.google.android.maps.OverlayItem;

    public class HelloItemizedOverlay extends ItemizedOverlay {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
Context mContext;

public HelloItemizedOverlay(Drawable defaultMarker) {
    super(boundCenterBottom(defaultMarker));
    // TODO Auto-generated constructor stub
}

public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
    super(boundCenterBottom(defaultMarker));
    mContext = context;
}

@Override
protected OverlayItem createItem(int i) {
    return mOverlays.get(i);
}

@Override
public int size() {
    return mOverlays.size();
}

public void addOverlay(OverlayItem overlay) {

    mOverlays.add(overlay);
    populate();   <--------------GETTING ERROR HERE
}

@Override
protected boolean onTap(int index) {
    OverlayItem item = mOverlays.get(index);
    AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
    dialog.setTitle(item.getTitle());
    dialog.setMessage(item.getSnippet());
    dialog.show();
    return true;
}
    }
package com.rahul.besttracker;
导入java.util.ArrayList;
导入android.app.AlertDialog;
导入android.content.Context;
导入android.graphics.drawable.drawable;
导入com.google.android.maps.ItemizedOverlay;
导入com.google.android.maps.OverlayItem;
公共类HelloItemizeOverlay扩展了ItemizeOverlay{
private ArrayList mOverlays=new ArrayList();
语境;
公共HelloItemizeOverlay(可绘制默认标记){
super(boundCenterBottom(defaultMarker));
//TODO自动生成的构造函数存根
}
公共HelloItemizeOverlay(可绘制的defaultMarker,上下文){
super(boundCenterBottom(defaultMarker));
mContext=上下文;
}
@凌驾
受保护的OverlayItem createItem(int i){
返回mOverlays.get(i);
}
@凌驾
公共整数大小(){
返回mOverlays.size();
}
公共void addOverlay(OverlayItem overlay){
添加(覆盖);
填充();0&&Lon[i]>0){
地质点=新的地质点((int)(纬度[i]*1E6),
(int)(Lon[i]*1E6));
overlayitem=新的overlayitem(point,mArrayList.get(i),null);
}
itemizedoverlay.addOverlay(overlayitem);
添加(itemizedoverlay);
}
}
@凌驾
受保护的布尔值isRouteDisplayed(){
//TODO自动生成的方法存根
返回false;
}

}

在onCreate中的for循环中,如果不进入if语句,就永远不会实例化overlayitem,因此将添加指向overlay的空指针。这最终会导致崩溃。add应该是if的一部分。

onCreate中的for循环仅在if语句内部为变量overlayitem设置有效值,但在if语句外部的if语句之后使用它。如果该条件为false,则表示overlayitem为null。但你还是把它作为一个标记添加到地图上。这将导致最终的空指针错误。
package com.rahul.besttracker;

    import java.util.ArrayList;

    import android.app.AlertDialog;
    import android.content.Context;
    import android.graphics.drawable.Drawable;

     import com.google.android.maps.ItemizedOverlay;
    import com.google.android.maps.OverlayItem;

    public class HelloItemizedOverlay extends ItemizedOverlay {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
Context mContext;

public HelloItemizedOverlay(Drawable defaultMarker) {
    super(boundCenterBottom(defaultMarker));
    // TODO Auto-generated constructor stub
}

public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
    super(boundCenterBottom(defaultMarker));
    mContext = context;
}

@Override
protected OverlayItem createItem(int i) {
    return mOverlays.get(i);
}

@Override
public int size() {
    return mOverlays.size();
}

public void addOverlay(OverlayItem overlay) {

    mOverlays.add(overlay);
    populate();   <--------------GETTING ERROR HERE
}

@Override
protected boolean onTap(int index) {
    OverlayItem item = mOverlays.get(index);
    AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
    dialog.setTitle(item.getTitle());
    dialog.setMessage(item.getSnippet());
    dialog.show();
    return true;
}
    }
package com.rahul.besttracker;

import java.util.ArrayList;
import java.util.List;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
 import com.google.android.maps.Overlay;
 import com.google.android.maps.OverlayItem;

import android.graphics.drawable.Drawable;
import android.os.Bundle;

public class Mapview extends MapActivity {
MapView map;
ArrayList<String> mArrayList;
double[] Lat;
double[] Lon;

String stops[];
int latarr[], lonarr[];
OverlayItem overlayitem;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.maps);

    map = (MapView) findViewById(R.id.Map);
    // map.setBuiltInZoomControls(true);
    // setContentView(R.layout.maps);
    Bundle gotBasket = getIntent().getExtras();
    mArrayList = gotBasket.getStringArrayList("stops");
    Lat = gotBasket.getDoubleArray("Lat");
    Lon = gotBasket.getDoubleArray("Lon");

    System.out.println("SIZE+++" + Lat.length + " " + Lon.length);
    for (int i = 0; i < mArrayList.size(); i++) {
        System.out.println(" \n" + Lat[i] + "\t" + Lon[i]);
    }
    // stops=(String[]) mArrayList.toArray();

    List<Overlay> mapOverlays = map.getOverlays();
    Drawable drawable = this.getResources().getDrawable(
            R.drawable.mark_blue);
    HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(
            drawable, this);

    for (int i = 0; i < mArrayList.size(); i++) {

        if (Lat[i] > 0 && Lon[i] > 0) {
            GeoPoint point = new GeoPoint((int) (Lat[i] * 1E6),
                    (int) (Lon[i] * 1E6));
            overlayitem = new OverlayItem(point, mArrayList.get(i), null);
        }
        itemizedoverlay.addOverlay(overlayitem);
        mapOverlays.add(itemizedoverlay);
    }
}

@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}