在不同的类中使用时,我的PrintWriter值变为无效

时间:2011-04-19 23:42:00

标签: java class variables null printwriter

我是编程新手,我需要帮助解决这个小障碍。我正在制作一个简单的聊天程序,包括服务器和聊天客户端。所以我的客户端启动,并创建一个网络连接就好了,其中包括一个发送到我的服务器的PrintWriter。然后,在另一个类(我的ActionListener)中,当我调用writer变量时,它以NullPointerException结束。

所以我每次运行ActionListener时都尝试调用setupnetworking,但是我最终会遇到很多连接而且我的消息打印出来不止一次。我可以在我的main()方法中保留setupnetworking,并为PrintWriter类保留ActionListener的变量值。如果我感到困惑,我很抱歉,所以请查看我的代码并告诉我你的想法。

这是整个计划......

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程序。这只是建立连接。

1 个答案:

答案 0 :(得分:0)

这可能是多线程的内存初始化问题。如果在初始化之前在EDT上读取writer字段,则在主线程上初始化时,可能不会再次在该线程上重新读取该字段。

作为快速测试,请将volatile添加到writer的声明中。