0

我想在java中創建一個簡單的客戶端/服務器應用程序,它有一個主要啓動線程 - 偵聽器線程和可運行 - 發送器線程。 他們與一個工作程序進行通信。 套接字是在偵聽器線程上創建的,就像輸入和輸出靜態變量一樣。爲什麼在寫入到另一個線程定義的套接字輸出時會出現(java)NullPointerException異常?

問題是: 我可以使用輸出,但只有當我從它定義的偵聽器線程中調用它時。 (output.writeBytes(「0000」);) 當我嘗試從發件人runnable調用它時,我得到一個空異常! (InfoListener.output.writeBytes( 「0000」);)

這裏是我的(沒有那麼聰明)的代碼,沒有所有的異常處理:

* InfoListener.java文件*

public class InfoListener extends Thread { 

    public int port = 5000; 
    public Socket socket = null; 
    static BufferedReader input; 
    static DataOutputStream output; 
    static boolean can_start_sender = false; 

    static boolean active = true; 
    static String answer=""; 

    public void run() 
    {    
     // init socket 
     socket = new Socket("127.0.0.1", port); 
     output = new DataOutputStream(socket.getOutputStream()); 
     input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     can_start_sender = true; 

     while (active) // while main app is active 
     { 
      // Read new data!! 
      answer = input.readLine(); 
      if (answer!=null) 
      { 
       System.out.println("Info : Listener received : " + answer); 
      } 
     } 
    } 
} 

* InfoSender.java文件*

public class InfoSender implements Runnable { 


    static InfoListener infoListener; 
    static InfoSender infoSender; 
    static String string_to_send = "0000"; 

    public static void main(String[] args) 
    { 
     // start listener 
     infoListener = new InfoListener(); 
     infoListener.start(); 

     // Start Sender 
     infoSender = new InfoSender(); 
     infoSender.run(); 

     while (infoListener.isAlive()) 
      Thread.sleep(100); 
    } 

    public void run() 
    { 
     //attempt to connect to the server and send string 
     // Wait for socket 
     while (InfoListener.can_start_sender = false) 
      Thread.sleep(100); 

     // write -------- HERE IS THE NULLPOINTEREXCEPTION ------------ 
     InfoListener.output.writeBytes(string_to_send); 
     System.out.println("Info : info sent :"+ string_to_send); 

     // wait a bit for listener to get response back, then close 
     Thread.sleep(10000); 
     InfoListener.active = false; 
     } 
} 

請幫助: |

+0

這些字段都不應該是靜態的。 – EJP

回答

1

while (InfoListener.can_start_sender = false) 

要分配給falsecan_start_sender。因此while將始終解析爲false

是下面的代碼while

// write -------- HERE IS THE NULLPOINTEREXCEPTION ------------ 
InfoListener.output.writeBytes(string_to_send); 

,對其他Thread之前有時間來初始化staticoutput場從而導致NullPointerException得到執行這是可能的。

使用

while (!InfoListener.can_start_sender) 

或更好,但使用CountDownLatch或類似java.util.concurrent鎖定對象。您還應該製作can_start_sendervolatile

+0

非常感謝 - 我的noob錯誤:NullPointerException已解決,但不知何故,我沒有得到它的另一邊,直到我關閉發件人和聽衆..我會解決它..:{ –

+0

@HaimRimon不要忘記在你的'OutputStream'實例上調用'flush()'。 –

+0

對於關閉:我沒有得到它的另一端,因爲我使用了readline,並沒有發送一個「\ n」的結尾,所以信息沒有到達,直到我關閉輸出的套接字。 :) –

相關問題