2012-12-01 31 views
1

有3個類。將對象傳遞給實現可運行的類的目的

  1. CallMe打印出消息的基本類
  2. Caller器具Runnable並將其從主類Synch
  3. Synch其中用於CallMe創建該對象,並傳遞相同於Caller類的主類獲取對象類並啓動線程。

問題: 在Synch類,什麼是對象傳遞給類Caller的需要?當我嘗試調用Caller而沒有CallMe的對象時,編譯器會拋出一個NullPointerException。你能否提供任何這種行爲的原因。

如: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"); 
     } 
    } 
} 

回答

0

編譯器會引發一個NullPointerException因爲該行

target.call(msg) 

如果傳遞null到來電構造,然後實例變量目標被設置爲null,而且你調用一個空引用的方法,因此NullPointerException。

至於爲什麼你需要同時擁有一個'Caller'和'CallMe'類,這只是一個風格問題。這個想法是爲您的代碼可能包含的任何業務邏輯創建一個Runnable'包裝類'。這種方式不會將線程綁定到項目的核心。

+0

感謝您的回答 – user1822729

0

主叫OB1 =新呼叫者( 「你好」);

首先,這將是編譯時錯誤,因爲您沒有Caller構造函數,它只接受一個字符串作爲參數。

當我累了沒有「的CallMe」的對象編譯的類「來電」的呼叫拋出空指針異常

我假設你的意思是已經創建來電者如下:

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

如果是這樣,那麼NPE會被您的運行方法拋出,該方法由您在Caller構造函數中調用0123'調用自動調用。看起來Caller的作業用於在單獨的線程中運行CallMe函數,因此傳遞給它的CallMe對象必須爲非空值。 NPE的原因是您的案例中沒有有效的CallMe對象。

HTH。

0

的對象的CallMe目標裏面來電未初始化的,因此具有null值,直到你調用構造函數調用者(目標,「XXX」)對其進行初始化。當您調用的對象的值爲null時,您始終會得到null pointer exception

如果您使用Caller(「XXX」)而不傳入CallMe對象,則不會初始化Caller對象內部的target