1

3クラスあります。

  1. CallMeメッセージを出力する基本クラス
  2. Caller実装Runnableし、メインクラスからオブジェクトを取得しますSynch
  3. Synchオブジェクトを作成しCallMeてクラスクラスに渡しCaller、スレッドを開始するメインクラス。

質問:Synchクラスでは、オブジェクトをクラスに渡す必要は何Callerですか? コンパイラCallerのオブジェクトなしでクラスを呼び出そうとすると、 . この行動の理由を教えてください。CallMeNullPointerException

例:Caller ob1 = new Caller("Hello"); // calling without an object of class "CallMe"

以下は、参照用の作業コードです。

public class CallMe {
    void call(String msg) {
        System.out.print("[" + msg);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            System.out.println("Interrupted");
        }
        System.out.println("]");
    }
}

class Caller implements Runnable {
    String msg;
    CallMe target;
    Thread t;

    public Caller(CallMe targ, String s) {
        target = targ;
        msg = s;
        t = new Thread(this);
        t.start();
    }

    public void run() {
        target.call(msg);
    }
}

class Synch {
    public static void main(String args[]) {
        CallMe target = new CallMe();
        Caller ob1 = new Caller(target, "Hello");
        Caller ob2 = new Caller(target, "Synchronized");
        Caller ob3 = new Caller(target, "World");
        // wait for threads to end
        try {
            ob1.t.join();
            ob2.t.join();
            ob3.t.join();
        } catch (InterruptedException e) {
            System.out.println("Interrupted");
        }
    }
}
4

3 に答える 3

0

Caller内のCallMeオブジェクトターゲットnullは初期化されていないため、コンストラクターCaller(target、 "XXX")を呼び出して初期化するまで値があります。null pointer exception呼び出すオブジェクトの値がである場合は、常にを取得しますnull

CallMeオブジェクトを渡さずに代わりにCaller( "XXX")を使用する場合、targetCallerオブジェクト内は決して初期化されません。

于 2012-12-01T04:46:07.293 に答える
0

発信者 ob1 = 新しい発信者("こんにちは");

まず、Caller引数として文字列のみを受け取るコンストラクターがないため、これはコンパイル時エラーになります。

「CallMe」のオブジェクトなしでクラス「Caller」への呼び出しに疲れたとき、コンパイラはヌルポインタ例外をスローします

次のように呼び出し元を作成するつもりだったと思います。

Caller ob1 = new Caller(null, "Hello"); 

その場合、NPE は、コンストラクターにあるthread.start()呼び出しによって自動的に呼び出される run メソッドによってスローされます。Callerの仕事は関数を別のスレッドでCaller実行するために使用されているようです。そのため、渡されるオブジェクトは null 以外の値でなければなりません。NPE の理由は、あなたの場合に有効なオブジェクトがないことです。CallMeCallMeCallMe

HTH。

于 2012-12-01T04:37:04.390 に答える
0

行が原因で、コンパイラは NullPointerException をスローします。

target.call(msg)

null を Caller コンストラクターに渡すと、インスタンス変数 target が null に設定され、null 参照でメソッドを呼び出しているため、NullPointerException が発生します。

「Caller」クラスと「CallMe」クラスの両方が必要な理由については、スタイルの問題です。アイデアは、コードに含まれる可能性のあるビジネス ロジックの Runnable 'wrapper class' を作成することです。そうすれば、スレッド化はプロジェクトのコアに結び付けられません。

于 2012-12-01T04:38:55.853 に答える