一、先贴上代码
以下代码的作用是,为其所在的MainActivity类的两个按键指定按键响应函数。
private OnClickListener listener = new OnClickListener() {
//1.intent在这里初始化是错误的!!
Intent intent = new Intent(MainActivity.this,BindServiceDemo.class); //*1
public void onClick(View v) {
//2.intent在这里初始化是是正确的!!
Intent intent = new Intent(MainActivity.this,BindServiceDemo.class);
switch (v.getId()) {
case R.id.btnBindService:
bindService(intent, conn, Context.BIND_AUTO_CREATE);
break;
case R.id.btnUnbindService:
unbindService(conn);
break;
default:
break;
}
}
};
错误信息除了标题的提示外,还有“java.lang.NullPointerException”的错误,代码检查了数遍还是不得其解,最终在CSDN获得了些启示。
二、原因分析
因为这里的listener是MainActivity这个类的一个普通成员,普通成员会在类实例化时初始化。当启动MainActivity时,必然会有类似new MainActivity()之类的行为,此时就要对listener这个成员变量初始化了。于是,实例化listener时,要执行new OnClickListener(),那么就会执行到“*1”这一行(初始化自身的成员变量)。此时要用到“MainActivity.this”!!
问题就在这里!!由于MainActivity类的实例化对象尚在生成阶段,因此此时的MainActivity.this还是个空指针!错误由是而生。
三、后记
我们常常看到的“类名.this”,都是出现在方法中的。因为方法是所在类生成实例化对象之后才通过“类名.方法名”引用的,因此不会出错。
不知大家认为如何?
希望大家可以不犯这个错误了!