2011-04-19 38 views
1

我是編程新手,我需要這個小障礙幫助。我正在製作一個簡單的聊天程序,有一臺服務器和一個聊天客戶端。所以我的客戶端啓動,並創建一個網絡連接就好了,其中包括一個PrintWriter發送到我的服務器。然後,在另一個類(我的ActionListener)中,當我調用writer變量時,它會以NullPointerException結束。我的PrintWriter的值在不同的類中使用時無效

所以我嘗試每次運行ActionListener時都調用setupnetworking,但是他們最終會連接到多個連接,並且我的消息會多次打印出來。我可以在我的main()方法中保持設置網絡狀態,併爲我的ActionListener類保留變量值PrintWriter。如果我很困惑,我很抱歉,所以請看看我的代碼並告訴我你的想法。

這裏就是整個節目......

import java.util.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.awt.*; 
import java.io.*; 
import java.net.*; 
public class SimpleChatClient { 

    BufferedReader reader; 
    PrintWriter writer; 
    Socket sock; 
    JTextArea chatbox = new JTextArea(10,20); 
    JTextField entertext = new JTextField(20); 
    JButton sendchat = new JButton("send"); 

    public void go(){ 
     setUpNetworking(); 
     Thread readerThread1 = new Thread(new IncomingReader()); 
     readerThread1.start(); 
     //big probelm. to many setUpNetworkings!!!!!!!! 
    } 

    public class SendButtonListener implements ActionListener{ 
     public void actionPerformed (ActionEvent ev){ 
     try { 
       writer.println(entertext.getText()); 
       writer.flush(); 
       System.out.println("chat flush"); 
      } 
      catch (Exception ex) { 
       ex.printStackTrace(); 
       System.out.println("action fail"); 
      } 
      entertext.setText(""); 
      entertext.requestFocus(); 
     } 
    } 

    public void setUpNetworking() { 
     try { 
      sock = new Socket("192.168.0.11", 65534); 
      InputStreamReader streamReader = 
       new InputStreamReader(sock.getInputStream()); 
      reader = new BufferedReader(streamReader); 
      writer = new PrintWriter(sock.getOutputStream(), true); 
      System.out.println("network established. Beginning mainstream feed."); 
     } 
     catch (IOException ex) { 
      ex.printStackTrace(); 
      System.out.println("setup fail"); 
     } 
    } 


    public class IncomingReader implements Runnable { 
     public void run() { 
      String message; 
      try { 
       while ((message = reader.readLine()) != null) { 
        System.out.println("read " + message); 
        chatbox.append(message + "\n"); 
        chatbox.append("\n"); 
       } 
      }catch (Exception ex) { 
       ex.printStackTrace(); 
       System.out.println("run fail"); 
      } 
     } 
    } 
} 

P.S我有一個GUI程序這一點。這只是建立了連接。

+0

你怎麼知道它是空的作家 - 你有沒有在調試器中加入或者添加了一個轉儲到System.out? – mdma 2011-04-19 23:52:14

+0

是的,我有,這只是一個沒有一堆的版本System.out.print – 2011-04-19 23:56:50

+0

它是否打印'「網絡建立...」'? – 2011-04-20 00:37:57

回答

0

這可能是多線程的內存初始化問題。如果在EDT初始化之前在EDT上讀取了writer字段,那麼在初始化主線程時,該字段可能不會在該線程上重新讀取。

作爲快速測試,將volatile添加到聲明writer