Android:在ClickListener上实现,NullPointerException



这可能是我有限的经验,但我刚刚遇到了一个奇怪的错误,这让我很困惑。我有一个带有一堆按钮的"活动",然后这些按钮被分配到二维数组(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()有关

最新更新