質問
回答:
これらの行が表示され、私がそうであったように霧になった場合、ここにそれらの意味があります。
Thread[AWT-EventQueue-0] (Suspended (exception NullPointerException))
EventDispatchTread.run() line: not available [local variables unavailable]
これらの変数は、どこか不気味なライブラリの謎の覆いの後ろに潜んでいるので利用できないわけではありません。いやいや、彼らは範囲外になりました!それはあなたのせいです、あなたはまだnullを見つけなければなりません、そしてあなたはライブラリを責めることはできません。重要なレッスン!
質問:
初心者にとって、私にとって最もイライラすることの1つは図書館です!それは愛と憎しみの関係です:一方では、私が理解しているコードの処理方法を通常は理解できないことをさせてくれます。他方では、それらを完全に理解していないため、それ以外の場合は正常に動作しているコードのレンチ!これらのライブラリを使用するときに発生する可能性のあるエラーを理解していないため、私はそれらを書いていないため、そしてインポートの1つが機能し始めたときにEclipseが私に大したことを与えないからです...
ここに問題があります。私はjava.awt.eventと連携して、画面上の多数のJButtonをあちこちで処理しています。作成したボタンの1つを使用するとエラーが発生します。エラーは次のとおりです。
<=>
<=>
これはどういう意味ですか?何が原因ですか?コードを投稿するのは恥ずかしいですが、もしあなたが私のひどいスタイルを解読しようとすることができるなら、このエラーがスローされる原因と思われるメソッドがあります。
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();
}
}
}
解決
GUIコードの記述の複雑さへようこそ。
Swingプログラムを実行すると、イベントディスパッチスレッドと呼ばれるバックグラウンドスレッドが作成されます。たとえば、ユーザーがJButtonをクリックすると、JButtonはこのイベントディスパッチスレッドを使用してイベントを作成して起動します。したがって、名前:イベントをディスパッチするのはスレッドです!
あなたのコード:
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
String name;
// more code...
}
このイベントディスパッチスレッドによって呼び出されるため、コードでイベントを処理できます。
コード内のどこかで、現在nullに等しい変数を使用して何かを実行しようとしています。エラーメッセージは、<!> quot;ちょっと、イベントディスパッチスレッドでコードを実行中に、NullPointerException <!> quot;に遭遇したことを伝えています。 コード内。
なぜもっと情報が届かないのですか?コンパイル時にデバッグ情報が含まれないようにEclipseを構成した可能性がありますか?
今のところ、変数の状態を示すためにactionPerformedメソッドにいくつかの行を追加することをお勧めします:
System.out.println("field = " + field);
System.out.println("rules = " + rules);
System.out.println("display = " + display);
これによりヌルが表示されるかどうかを確認します。
NullPointerExceptionがライブラリから発生した場合でも、スタックトレースは、そのライブラリを呼び出したコードの行を示します。ただし、デバッグ情報を生成するようにEclipseを構成した場合のみ。
長期的には、SunのSwingチュートリアルを読んで、これらの問題の詳細を確認してください。
他のヒント
nullオブジェクトでメソッドを呼び出すと、nullポインター例外が発生します。
コードでは、ルール、名前、または表示がnullであり、例外が発生する可能性があります。
デバッガー(Eclipse IDEに含まれるものなど)を使用して、actionPerformed()メソッドの開始点にブレークポイントを設定し、1行ずつステップ実行して、メソッドを呼び出そうとしている変数がnullです。
2行後にスタックトレースの読み取りを停止しないでください。スタックトレースのどこかで、作成したクラス/メソッドの1つの名前がわかります。そこから探し始めてください。 (ところで、人々はデバッガーの中で多くの時間を費やしている:-))
ActionCommandを実際に設定するのを忘れている可能性があります。
ActionEvent APIドキュメントには、getActionCommand()のnull結果の可能性に関する注意事項があります。