3

ループ内のボタンにテキストを割り当てようとしていますが、NullPointerExceptionが発生します。クラスのコンストラクター内でボタン配列を初期化し、初期化した後、次のメソッドを呼び出します。これがエラーが発生するコードです。

public class Alfred
{
   private String names[]={"nfs","gta","maxpayne","hitman"};
   private JButton but[];

   public Alfred()
   {
    ...
     but= new JButton[4];
    AssignLettersToButtons();
   }
    private void AssignLettersToButtons()
    {       
        for(int i=0;i<names.length;i++)
        {
            but[i].setText(names[i]); // error
            pane1.add(but[i]);
        }
    }
}
}

ボタン配列と名前配列の長さは同じです。この例外の理由は何ですか?どうすれば解決できますか?

よろしく

4

5 に答える 5

5
 but= new JButton[4]; 

これは、4つの配列要素にのみスペースを割り当てます。各要素は、オブジェクトなどの参照型のデフォルト値であるに初期化されます。nullJButton

but[0]、、、but[1]はすべてbut[2]です。but[3]null

次のように初期化する必要があります。

but[0] = new JButton(); //or whatever.
于 2012-11-16T18:51:11.957 に答える
1

but配列内の要素を初期化していません。

ループで初期化を実行する場合は、次のように簡略化できます。

for (int i=0;i<names.length;i++)
    pane1.add(but[i] = new JButton(names[i]));
于 2012-11-16T18:47:39.863 に答える
0

ここ

  but[i].setText(names[i]); //but[i] is null here

メソッドを呼び出す前に、but配列を初期化します

配列内の要素はすべてnullであるため、インスタンス化します。

   for(int i=0;i<names.length;i++)
    {
        System.out.println(but[i]);//all will print null
    }

このようなコードを試して、要素もインスタンス化してください

   for(int i=0;i<names.length;i++)
    {
       but[i]= new Jbutton();
    }
于 2012-11-16T18:49:05.723 に答える
0

but配列のサイズが5の場合、次の手順を実行する前に、5つのbutオブジェクトを追加します。

but[i].setText(names[i]);

配列はオブジェクトで初期化されていないと思います。そのため、配列を初期化するとsetText()NPEが得られます。

次のように試してください。

for(int i=0;i<names.length;i++)
        {
            JButton butObject = new JButton();//Add this line to your code
            but[i]=butObject;         // Add this line to your code
            but[i].setText(names[i]); // error
            pane1.add(but[i]);
        }
于 2012-11-16T18:53:28.383 に答える
0

Javaは、タイプJButtonの配列を0(別名NULL)に初期化します。配列の各インデックスは、要素ごとにコンストラクターを自動的に呼び出さないため、JButtonのインスタンスへのポインターになるように初期化する必要があります。

于 2012-11-16T19:47:07.333 に答える