Java for Android中的一个非常奇怪的循环错误?

时间:2011-12-22 17:44:25

标签: java android

我正在尝试更改按钮数组的属性,但是我遇到了一些非常奇怪的错误。我试图循环按钮来编辑每个按钮的高度属性,但是当我设置for循环(i = 0; i< 3; i ++)时,buttonSkater [i] .setHeight(buttonHeight);结果似乎是9个按钮被改变了!当我设置i< 14(有14个按钮)时,应用程序崩溃并出现NullPointerException。

package com.rollerderby.lineuptracker;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.Button;


public class Setup extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.setup); 

        Button[] buttonSkater = new Button[14]; 
        buttonSkater[0] = (Button) findViewById(R.id.buttonSkater1);
        buttonSkater[1] = (Button) findViewById(R.id.buttonSkater2);
        buttonSkater[2] = (Button) findViewById(R.id.buttonSkater3);

        int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); 
        int buttonHeight = (screenHeight-60)/14; 


        for(int i=0; i<14; i++)
        {
            buttonSkater[i].setHeight(buttonHeight);
        }


    }
}

这似乎是一个非常奇怪的错误......我错过了一些明显的东西吗?

(通过为新按钮创建空间来调整数组大小错误?)

4 个答案:

答案 0 :(得分:3)

完全基于您的代码示例,您尝试访问仅设置了3个索引(0到2)的数组中的第3到第14个元素,其他(默认情况下)初始化为null。至于14个按钮,它们只是14个按钮的实例吗?

答案 1 :(得分:3)

@ fwielstra的回答是正确的,但对于后人,我想我会为你的代码添加一些改进,以帮助解决未来的问题。而不是做这种容易出现这种错误的代码:

Button[] buttonSkater = new Button[14]; 
buttonSkater[0] = (Button) findViewById(R.id.buttonSkater1);
buttonSkater[1] = (Button) findViewById(R.id.buttonSkater2);
buttonSkater[2] = (Button) findViewById(R.id.buttonSkater3);

相反,您可以初始化数组的大小,如:

Button[] buttonSkater = new Button[] {
    (Button) findViewById(R.id.buttonSkater1),
    (Button) findViewById(R.id.buttonSkater2),
    (Button) findViewById(R.id.buttonSkater3),
};

当您处理数组时,而不是执行以下操作,这意味着如果您更改数组的大小,则需要在多个位置执行此操作:

for (int i = 0; i < 14; i++)
    ...

我会用:

for (int i = 0; i < buttonSkater.length; i++)
    ...

祝你好运。

答案 2 :(得分:1)

如果没有访问你的XML,我的猜测是,如果有一个循环直到3你正在更改其他9个按钮,那是因为他们的id可能是相同的(即复制/粘贴错误)。

另外,从您的代码来看,您的应用程序在您的应用程序崩溃到14之前似乎正常;毕竟,只有前3个元素被实例化。一旦到达第4个,它应该访问一个空值,从而导致错误。

答案 3 :(得分:0)

嗯,首先,你的“14”循环失败,因为只有位置0-2被分配给任何东西。在Java中,当你做

 String[] strings = new String[5];

除了数组实际上已经初始化了

 strings[0] == null;

等等,直到你实际初始化了这些值。

您需要使用

手动初始化每个值
strings[0] = new String();
strings[1] = new String();
...

我们需要查看其他代码来回答有关修改九个按钮的问题。