1

答え:

これらの行を見て、私のように誤解されている場合は、次のことを意味します。

Thread[AWT-EventQueue-0] (Suspended (exception NullPointerException))

EventDispatchTread.run() line: not available [local variables unavailable]

変数がどこかの湿った図書館の謎の覆いの後ろに潜んでいるので、変数が利用できないというわけではありません。いいえ、対象外です!それはまだあなたのせいです.nullを見つけなければなりません.ライブラリを責めることはできません. 重要な教訓!

質問:

初心者の私にとって最もイライラすることの 1 つはライブラリです。それは愛憎関係です: 一方で、彼らは、私が理解できるコードをどうやって処理するか、私が通常理解できないようなことを私にさせてくれます。それ以外の場合は正常に機能しているコードをレンチしてください。これは、これらのライブラリを使用するときに発生する可能性のあるエラーを理解していないためです。それらを作成していないためです。また、インポートの 1 つが動作し始めたときに eclipse を使用することはあまりありません...

ここに問題があります。私は java.awt.event を使用して、画面上のさまざまな JButton を処理してきました。作成したボタンの 1 つを使用すると、エラーが発生します。エラーは次のとおりです。

Thread[AWT-EventQueue-0] (Suspended (exception NullPointerException))

EventDispatchTread.run() line: not available [local variables unavailable]

これは何を意味するのでしょうか?何が原因でしょうか?コードを投稿するのは恥ずかしいですが、私のひどいスタイルを解読しようとすることができるなら、このエラーがスローされる原因と思われるメソッドを次に示します。

public void actionPerformed(ActionEvent e) {
    String cmd = e.getActionCommand();
    String name;

code...

if(cmd.equals("Play")) {
        name = field.getText();
        card = getCard(name);
        
        if(card != null) {
            if(rules.zoneHasCard(card, rules.hand)) {
                display.updateStatusMessage(rules.play(card));
                field.setText("");
                display.updateHand(rules.zoneList("hand"));
                display.updateDiscard(rules.zoneList("Discard")); // This is the error here! The discard Zone was empty!
            }
            else {
                field.setText("You do not have " + card.getName());
                field.selectAll();
            }
        }
        else {
            field.setText("That cardname is unused");
            field.selectAll();
        }
    }
}
4

5 に答える 5

4

GUI コードを書くことの複雑さへようこそ。

Swing プログラムを実行すると、イベント ディスパッチ スレッドと呼ばれるバックグラウンド スレッドが作成されます。たとえば、ユーザーが JButton をクリックすると、JButton はこの Event Dispatch Thread を使用してイベントを作成し、起動します。したがって、その名前は、イベントをディスパッチするスレッドです!

あなたのコード:

public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        String name;

// more code...
}

このイベント ディスパッチ スレッドによって呼び出されるため、コードでイベントを処理できます。

コード内のどこかで、現在 null に等しい変数を使用して何かをしようとしています。エラー メッセージは、「イベント ディスパッチ スレッドでコードを実行しているときに、コードで NullPointerException が発生しました」と伝えています

詳細情報が届かないのはなぜですか? コンパイル時にデバッグ情報を含めないように Eclipse を構成した可能性がありますか?

今のところ、actionPerformed メソッドにいくつかの行を追加して、変数の状態を表示することをお勧めします。

System.out.println("field = " + field);
System.out.println("rules = " + rules);
System.out.println("display = " + display);

これでヌルが表示されるかどうかを確認してください。

NullPointerException がライブラリから発生した場合でも、スタック トレースは、コードのどの行がそのライブラリを呼び出したかを示します。ただし、デバッグ情報を生成するように Eclipse を構成した場合のみです。

長期的には、Sun の Swing チュートリアルに取り組み、これらの問題について詳しく学んでください。

于 2008-12-05T11:12:02.317 に答える
1

2 行後にスタック トレースの読み取りを停止しないでください。スタック トレースのどこかに、作成したクラス/メソッドの名前が表示されます。そこから探し始めます。(ところで、人々はデバッガの内部で多くの時間を費やしています:-))

于 2008-12-05T11:10:42.367 に答える
1

null オブジェクトでメソッドを呼び出すと、null ポインター例外が発生します。

コードでは、ルール、名前、または表示が null で、例外が発生する可能性があります。

于 2008-12-05T10:43:34.447 に答える
1

デバッガー (Eclipse IDE に含まれているものなど) を使用し、actionPerformed() メソッドの先頭にブレークポイントを設定してから、1 行ずつステップ実行して、メソッドを呼び出そうとしている変数が null であることを確認します。

于 2008-12-05T10:58:33.373 に答える
0

実際に ActionCommand を設定するのを忘れている可能性があります。

ActionEvent API Docには、getActionCommand() の結果が null になる可能性に関する注意事項があります。

于 2008-12-05T11:09:57.267 に答える