这可能是我有限的经验,但我刚刚遇到了一个奇怪的错误,这让我很困惑。我有一个带有一堆按钮的"活动",然后这些按钮被分配到二维数组(btns[][])中。最初,我使用一个匿名类来设置OnClick Listener,对于每个按钮,基本上如下所示:
btns[x][y].setOnClickListener(new OnClickListener(() {
onClick(View v) {
btns_OnClick(x, y, btns[x][y]);
}
并不是说在这种情况下x和y是硬编码的常数。
由于这真的困扰着我,我实现了:
private class TimerButtonOnClickListener implements OnClickListener {
int[] crds;
public TimerButtonOnClickListener(int row, int col) {
crds = new int[] { row, col };
}
public void onClick(View v) {
btns_OnClick(crds[0], crds[1],
btns[crds[0]][crds[1]]);
}
}
并将监听器分配给按钮,如下所示:
for (int i = 0; i < 6; i++)
for (int j = 0; j < 2; j++)
btns[i][j].setOnClickListener(new TimerButtonOnClickListener(i, j));
上面的情况发生在onCreate中,但崩溃不会立即发生。事实上,我不知道它在哪里坠毁。LogCat给出
FATAL EXCEPTION: main
java.lang.NullPointerException
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1061)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1078)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
我使用一个处理程序从Timer Task调用ui更新,但即使我删除了计时器,我仍然会收到这个错误,所以可能不是我自己的处理程序在那里崩溃。
除此之外,我没有对来源进行任何更改。(我甚至进行了差异处理,也没有接触任何其他文件。)
我做错了什么?
错误与按钮无关。stacktrace会提到"button"、"onClick"或与按钮相关的东西(如果是这样的话)。
相反,NullPointerException
发生在系统连接到Service
时。查看发生异常的地方的来源
在android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1061)
if (service != null) {
// mConnection is a ServiceConnection
mConnection.onServiceConnected(name, service); // 1061
}
可以看出,它很可能与具有null
ServiceConnection
的Context#bindService()有关