-1

という名前の GUI クラスがNewFrame.javaあり、もう 1 つはClient.javaです。Client.java では、NewFrame のオブジェクトはスレッド内で作成されます。元、

public class ClientA {

NewJFrame gui;
int x ;

public void go() {
            java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                gui  = new NewJFrame();
                gui.setVisible(true);
                x = 10;
            }
        });

        System.out.println(x); // does not print 10 but it prints 0

        gui.setTextboxvalue("value changed !!!"); 

        // can'se pass value to the function, with this error occurs as,
        // "java.lang.NullPointerException" at here.

      }
}

ここで 2 つの問題が発生しています。名前が付けられた NewFrame クラスにセッター メソッドがありsetTextboxValueますが、上記のようにこれを呼び出すと、「java.lang.NullPointerException」というエラーが発生します。

別の問題は次のとおりです。なぜxそのスレッド内に変数を設定できないのか、このスレッド内に設定すると、変数xの値が 10 である外部印刷はそこに印刷されず、代わりに印刷されます0

4

1 に答える 1

2

EventQueue.invokeLater別のスレッドでそのメソッドを呼び出します。このスレッドは、イベント ディスパッチ スレッド上の他のすべてのタスクが終了した後、イベント ディスパッチ スレッドで非同期に開始されます。つまり、run() メソッド内のコードは、メソッドの終了後に実行される可能性があります。したがって、gui変数は引き続き null になり、NullPointerException呼び出すときにgui.setTextboxvalue;になります。値を出力しても x は 0 のままです。

于 2013-02-18T18:21:37.253 に答える