setOnClickListener仅在for循环内抛出NullPointerException。为什么?

时间:2010-11-25 04:25:06

标签: android arrays button for-loop nullpointerexception

private final Button[] BUTTONS = {
    btn1, btn2, btn3,btn4
};

...

btn1 = (Button) this.findViewById(R.id.btn_1);
btn2 = (Button) this.findViewById(R.id.btn_2);
btn3 = (Button) this.findViewById(R.id.btn_3);
btn4 = (Button) this.findViewById(R.id.btn_4);

...

int n = BUTTONS.length;
for(int i=0; i<n; i++) {
    if(DEBUG) Log.d(TAG, String.valueOf(i));
    BUTTONS[i].setOnClickListener(this);
}

抛出NullPointerException,而

btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);

工作正常。对我没有任何意义。

1 个答案:

答案 0 :(得分:3)

我认为这是因为你的Buttons数组是在btn1,...仍为null时创建的。

因此,当您在循环中调用BUTTONS [i] .setOnClickListener时,您实际上是在说null.setOnClickListener,它会产生异常。

尝试将数组设置为变量,并在分配btn1等之后进行搜索。

没有测试过,但是这样的事情可能会更好......

private ArrayList mBtns = new ArrayList();

private void initButton(int id){   button =(Button)findViewById(id);   button.setOnClickListener(本);   mBtns.add(按钮); }

...

initButton(R.id.btn_1); initButton(R.id.btn_2); initButton(R.id.btn_3); initButton(R.id.btn_4);

除非按钮执行非常相似的操作,否则您可能会发现更好地在布局中的每个按钮上定义onClick属性并节省大量编码(仅适用于Android 1.6及更高版本)。