Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 上下文空指针_Java_Android_Google Maps - Fatal编程技术网

Java 上下文空指针

Java 上下文空指针,java,android,google-maps,Java,Android,Google Maps,我一直在学习本教程: 但是在onTapmContext中抛出了一个NullPointerException。。有人知道为什么吗?这是我的密码 public class Mapitems extends ItemizedOverlay{ Context mContext; private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); public Mapitems(Drawabl

我一直在学习本教程: 但是在
onTap
mContext中抛出了一个NullPointerException。。有人知道为什么吗?这是我的密码

    public class Mapitems extends ItemizedOverlay{
Context mContext;

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

public Mapitems(Drawable defaultMarker) {
      super(boundCenterBottom(defaultMarker));
    }

public Mapitems(Drawable defaultMarker, Context context) {
      super(defaultMarker);
      mContext = context;
    }
@Override
protected OverlayItem createItem(int i) {
    return mOverlays.get(i);
}

public void addOverlay(OverlayItem overlay) {
    mOverlays.add(overlay);
    populate();
}

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

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

  }
公共类Mapitems扩展了ItemizeOverlay{
语境;
private ArrayList mOverlays=new ArrayList();
公共地图项(可绘制的默认标记){
super(boundCenterBottom(defaultMarker));
}
公共映射项(可绘制的默认标记,上下文){
超级(默认标记);
mContext=上下文;
}
@凌驾
受保护的OverlayItem createItem(int i){
返回mOverlays.get(i);
}
公共void addOverlay(OverlayItem overlay){
添加(覆盖);
填充();
}
@凌驾
受保护的布尔onTap(整数索引){
OverlayItem item=mOverlays.get(索引);
AlertDialog.Builder dialog=新建AlertDialog.Builder(mContext);
setTitle(item.getTitle());
setMessage(item.getSnippet());
dialog.show();
返回true;
}
@凌驾
公共整数大小(){
返回mOverlays.size();
}
}
//编辑:我仍然有这个问题。赏金是给任何人谁可以给我一个解释,为什么我会得到这种错误,我该如何纠正它


//edit2:似乎过去的答案允许我单击该项目,但在地图视图中不显示其图标。。有人知道为什么吗?

当您使用带有一个参数的构造函数时,没有引用集,并且方法
AlertDialog.Buidler(/*param*/)
不需要空值

在初始化类
Mapitems
的对象的代码中搜索


请添加指向“本”教程的链接

获取NPE,您的客户端代码需要:

  • 仅使用2参数构造函数,即在上下文中使用的构造函数
  • 使用非空的
    上下文调用构造函数。如果从活动中传递
    ,请确保构造函数调用发生在
    onCreate()
    方法中或更高版本中。例如,这意味着您不能直接将
    Mapitems
    对象初始化为活动的字段
我看了一下您正在引用的教程,实际上他们忘了告诉您使用上下文调用构造函数。在
HelloItemizedOverlay.java
中,这是:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);
真的应该是:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);

更改代码中的相关引用(您正在实例化
Mapitems
),它应该可以工作。

查看您的代码,您可能会调用简单构造函数

public Mapitems(Drawable defaultMarker)
public Mapitems(Drawable defaultMarker, Context context)
此构造函数不设置
mContext
,这就是为什么会出现NullPointerException。
添加类似于
mContext=newcontext()
mContext=android.content.getApplicationContext()
的行可能会解决此问题

也可能为另一个构造函数提供了null参数

public Mapitems(Drawable defaultMarker)
public Mapitems(Drawable defaultMarker, Context context)
在分配mContext时插入空检查,并在必要时提供默认上下文,可以解决此问题

构造函数将如下所示:

public Mapitems(Drawable defaultMarker) {
    super(boundCenterBottom(defaultMarker));
    mContext = android.content.getApplicationContext();
    // or: mContext = new Context();
}

public Mapitems(Drawable defaultMarker, Context context) {
    super(defaultMarker);
    if(context==null)
        mContext = android.content.getApplicationContext();
        // or: mContext = new Context();
    mContext = context;
}

希望这能解决您的问题。

对于未显示的图像,在更改调用以正确设置上下文后

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);
被调用的构造函数与单参数构造函数处理图像的方式不同。将2参数构造函数更改为使用boundCenterBottom包装可绘制文件现在对我很有用

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

我添加了一个链接。我应该如何/在何处初始化它?再次查看此添加此允许我使其可单击,但不会在地图视图中显示图标。我能看到地图上的图标并点击它们吗?不客气。至于第二个问题,它可能是
hellogoglemaps
类中的某个东西,或者在您的版本中调用的任何东西。让舒尔在项目的
res/drawable/
目录中有一个图像,并确保您正确引用该图像。您可能会有一行类似于
this.getResources().getDrawable(R.drawable.[imgFileName])
的代码,其中[imgFileName]是不带扩展名(.png)的所需图像的名称