2010-02-27 99 views
2

我真的很感激一些幫助,我的計劃異常在線程 「線程4」 顯示java.lang.NullPointerException

Exception in thread "Thread-4" java.lang.NullPointerException 
    at ServerConnect.replyChoice(BaseStaInstance.java:63) 
    at ServerConnect.run(BaseStaInstance.java:45) 
    at java.lang.Thread.run(Thread.java:619) 

我ServerConnect函數看起來像: -

class ServerConnect extends Thread { 

Socket skt; 
String sProcessId; 
ServerConnect scnt = null; 
ObjectOutputStream myOutput; 
ObjectInputStream myInput; 


ServerConnect(){} 
ServerConnect(Socket connection, String sProcessNo) { 
    this.skt = connection; 
    this.sProcessId = sProcessNo; 
} 

public void run() { 
    try { 
    myInput = new ObjectInputStream(skt.getInputStream()); 
    ServerConnect scnt = new ServerConnect(); 

    while(true) { 
    try{ 
    int ownTimeStamp = Global.iTimeStamp; 

    Object buf = myInput.readObject(); 

    //if we got input, print it out and write a message back to the remote client... 
    if(buf != null){ 
LINE 45-->  **scnt.replyChoice(buf);** 

    } 

    }catch(ClassNotFoundException e) { 
    e.printStackTrace(); 
    } 
    } 
    } catch(IOException e) { 
    e.printStackTrace(); 
    } 
} 

void replyChoice(Object buf){ 


    try{ 
LINE 63 --> **myOutput = new ObjectOutputStream(skt.getOutputStream());** 


    System.out.println("Server read:[ "+buf+" ]"); 
    myOutput.writeObject("got it"); 
    myOutput.flush(); 

    }catch(IOException e){ 
    e.printStackTrace(); 
    } 
} 
} 

它基本上是一個套接字編程和多線程應用程序。在不同的終端上執行它以使客戶端和服務器建立連接,我執行我的代碼。但它在兩個終端上拋出上面的錯誤。它只是與我在錯誤的地方聲明myOutput變量有關。有人能幫助我嗎? 從錯誤消息中,我突出顯示了所附代碼段中的第63行和第45行。

回答

2

您的對象正在使用第一個構造函數進行初始化,該構造函數不帶任何參數。因此,skt從不初始化,因此null。當您調用skt.getOutputStream()時,它會拋出空指針異常,因爲它無法取消引用skt

+0

thk u for ur help – 2010-02-27 17:27:55

0
ServerConnect(){} 
ServerConnect(Socket connection, String sProcessNo) { 
    this.skt = connection; 
    this.sProcessId = sProcessNo; 
} 

你用什麼構造函數? SKT的原因可能是未初始化

//編輯:哦,我現在看你使用了錯誤的構造

ServerConnect scnt = new ServerConnect(); 

ServerConnect scnt = new ServerConnect(skt,sProcessId); 
+0

thk u for ur help – 2010-02-27 17:49:50

4
  1. 刪除默認的構造函數
  2. 讓您的實例字段(stk和sProrcessId)final
  3. 看你的編譯器如何抱怨和修復tho se問題

這些指示可幫助您交易運行時錯誤(如NPE)以編譯時間錯誤,這是您可以做的最好的事情。注意:這個絕招是爲了一般的使用。

+0

thk u for ur help – 2010-02-27 17:28:58

相關問題