2011-12-22 5 views
0

ボタンの配列の属性を変更しようとしていますが、いくつかの非常に奇妙なエラーが発生しています。私はボタンをループして、それぞれの高さ属性を編集しようとしていますが、forループ(i = 0; i < 3; i ++)を設定すると、buttonSkater [i] .setHeight(buttonHeight);結果は9つのボタンが変更されているようです!そして私が(14個のボタンがある)を設定すると、アプリケーションはNullPointerExceptionでクラッシュします。Android用Javaの非常に奇妙なforループのバグ?

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); 
     } 


    } 
} 

これは非常に奇妙なエラーのようです...私は何か明白なものを紛失していますか?

(新しいボタンのためのスペースでそれを作成することによって、誤った配列のサイズ?)

+0

デバッガを使用して、ループで実行されたアクションを実行します。上記のコードが、特にNPEを投げる理由を知っていますよね? –

答えて

3

あなたのコード例に純粋に基づいて、あなただけの3つのインデックスが設定されている配列の14番目の要素に第三にアクセスしようとしています(0〜2)、他のものは(デフォルトでは)nullに初期化されます。 14個のボタンについては、たぶん3個のボタンの14個のインスタンスでしょうか?

+0

ああ。うわー、私の脳は間違いなく冬の冬眠に入った:P – Eilidh

+0

ありがとう。 – Eilidh

1

あなたのXMLにアクセスできない場合は、私の推測では、ループ3で他の9つのボタンを変更している場合は、そのIDが同じである可能性がある(コピー/貼り付けミスなど)。

また、あなたのコードからは、アプリケーションが14までループするとアプリケーションがクラッシュすると思われます。結局、最初の3つの要素だけがインスタンス化されました。一度4になると、ヌル値にアクセスする必要があり、エラーが発生します。

+0

IDは間違いなく同じではありませんでした。 – Eilidh

0

まず、ポジション0〜2だけが割り当てられているため、「14」ループが失敗しています。あなたは

String[] strings = new String[5]; 

何もしますがとき、あなたが実際にそれらの値を初期化するまでJavaでは、配列は、実際にはそう

strings[0] == null; 

などが初期化されています。

あなたは私たちは、9つのボタンの変更についてのご質問にお答えするために他のコードを参照してくださいする必要があります手動で

strings[0] = new String(); 
strings[1] = new String(); 
... 

でそれぞれの値を初期化する必要があります。

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++) 
    ... 

最高の運があります。

+0

ありがとう:)私は長い間Javaをあまり使用していませんでした。私の頭はまだ霧が少し残っています。 ) - 悪寒の1ヶ月後。改善はいつも歓迎です:) – Eilidh

+1

確かに男。そこに行ったことがある。将来のためのよりよいパターンを指摘するだけです。運が良かった! – Gray