1

私はかなり基本的なコーディングを行っており、別のクラスからメソッドを呼び出そうとしていますが、何らかの理由で、別のクラスからメソッドを呼び出そうとするたびに null ポインター例外が発生します。クラスのインスタンスを正しく作成したと思いますが、よくわかりません。誰かが私に何がうまくいかないのか説明できれば、私はそれを感謝します.

呼び出しを行うクラスは次のとおりです。

 public class Menu extends JPanel implements ActionListener{

Skeleton skeleton;
Board board;

public Menu(){

    setBackground(Color.BLACK);

    JButton button = new JButton("hello");  
    button.addActionListener(this);
    this.add(button);
}

public JPanel getPanel(){
    return this;
}

@Override
public void actionPerformed(ActionEvent e) {
    board.boardTest();
}
}

そして、これがメソッドを含むクラスです

public class Board extends JPanel{

public Board(){
setBackground(Color.WHITE);
}

public JPanel getPanel(){
    return this;
}

public void boardTest(){
    System.out.print("hello");
}
}

ご覧のとおり、ユーザーがボタンをクリックするたびに「hello」が出力されます。

4

3 に答える 3

8

board.boardTest()Boardオブジェクトをボード変数に割り当てる前に呼び出しを行っているため、呼び出しを試みたときにNullPointerException(NPE)をスローする必要があり、null変数でメソッド呼び出しを行っているように見えます。

Board 変数 board を使用する前に、Board インスタンスを作成する必要があります。つまり、

Board board = new Board();

注 1: 今後同様の質問がある場合は、例外テキストを表示し、コード内でどの行が例外をスローするかをコメントで示してください。つまり、

@Override
public void actionPerformed(ActionEvent e) {
    board.boardTest();  // **** A NullPOinterException is thrown here ****
}

注 2: この質問は Swing 固有のものではなく、Java の基本的な問題です。最初に有効なオブジェクトを割り当てるまで、参照変数を使用することはできません。

于 2013-07-21T20:50:38.900 に答える
0

これは、クラスのインスタンスを作成する方法ではありません。あるクラスの変数を宣言するときは、new メソッドを使用する必要があります。そうしないと、コンパイラはこれに関連付ける方法がわからないため、プログラムが無効になり、null 例外が発生します。ご覧のとおり、プログラムを作成して開始しようとすると、最初にコンパイラーを通過し、コンパイラーはプログラムが有効かどうかをチェックし、そうでない場合は警告を発します。コンパイラはコードを長い文字列として認識し、それをトークンに分割します。もっと簡単にするために、変数に関する各宣言がトークンであり、各キーワードもトークンであるとしましょう。変数名は識別子です。したがって、コンパイラはトークンを検索し、そこにデータをいくつかのシンボルテーブルに保存し、型と値を言います。たとえば、int num =3; int はトークン、num は識別子で、3 は値です。コンパイラは、これに割り当てるメモリ量を認識します。あなたのケースでは、 Board board = new Board(); とは書きませんでした。このため、コンパイラは割り当てる領域を認識できず、インスタンスへの参照がありません。したがって、シンボル テーブルの値は宣言されません。これにより、コンパイラは null 例外を警告します。一部のクラスのコンストラクターのもう 1 つの役割は、一部のクラス フィールドを初期化することです。クラス Point があり、新しいポイントを作成するたびに最初の x、y がゼロになるようにしたいとします。したがって、シンボル テーブルの値は宣言されません。これにより、コンパイラは null 例外を警告します。一部のクラスのコンストラクターのもう 1 つの役割は、一部のクラス フィールドを初期化することです。クラス Point があり、新しいポイントを作成するたびに最初の x、y がゼロになるようにしたいとします。したがって、シンボル テーブルの値は宣言されません。これにより、コンパイラは null 例外を警告します。一部のクラスのコンストラクターのもう 1 つの役割は、一部のクラス フィールドを初期化することです。クラス Point があり、新しいポイントを作成するたびに最初の x、y がゼロになるようにしたいとします。

そう

Class Point{
int x,y;
 Point(){
    x=y=0;
}

また、新しいポイントを作成すると、初期座標は (0,0) になります。

Point p = new Point();
于 2013-07-21T21:30:02.387 に答える