java - readLine()在聊天程序中引发异常,我不知道为什么

标签 java sockets bufferedreader

我编写了一个小型的聊天程序,该程序包含3个类:TalkServer(服务器),TalkDienst(管理客户端之间的数据交换的线程类)和ChatProgram(客户端)。

TalkDienst:

    public class TalkDienst extends Thread {
    private Socket send, rec;
    private BufferedReader in;
    private PrintWriter out;
    private boolean sendClosed, recClosed;

    public TalkDienst(Socket send, Socket rec) {
        this.send = send;
        this.rec = rec;

        try {
            this.in = new BufferedReader(new InputStreamReader(this.rec.getInputStream()));
            this.out = new PrintWriter(new OutputStreamWriter(this.send.getOutputStream()), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        this.start();
    }

    @Override
    public void run() {
        // this.out.println("--- Partner found ---");
        System.out.println("Partner found");
        while (true) {
            try {
                String input = this.in.readLine();
                System.out.println("test");
                if (!input.equals(null)) {
                    this.out.println(input);
                }
            } catch (IOException e) {
                closeall();
                e.printStackTrace();
                break;
            } catch (NullPointerException e) {
                closeall();
                e.printStackTrace();
                break;
            }
        }
    }

    private void closeall() {
        try {
            this.send.close();
            this.rec.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

聊天程序:
    public class ChatProgramm extends JFrame implements Runnable
{
    private Thread t;
    private Socket s;
    private Container c;
    private JTextArea ta;
    private JScrollPane sp;
    private JScrollBar sb;
    private JTextField tf;

    private BufferedReader in;
    private PrintWriter out;

    private boolean socketClosed;

    public ChatProgramm(Socket h)
    {
        this.t = new Thread(this);

        this.s = h;
        try 
        {
            this.in = new BufferedReader(new InputStreamReader(this.s.getInputStream()));
            this.out = new PrintWriter(new OutputStreamWriter(this.s.getOutputStream()), true);
        } catch (IOException e) 
        {
            e.printStackTrace();
        }
        this.t.start();
//Just some UI things...[...]

        this.ta = new JTextArea();
        this.ta.setEditable(false);
        this.ta.setText("--- Waiting for partner ---");

        this.tf = new JTextField();
        this.tf.addActionListener(new ActionListener()
        {

            @Override
            public void actionPerformed(ActionEvent arg0) 
            {
                if(tf.getText().length() > 0)
                {
                    out.println(">>>: " + tf.getText());
                    ta.setText(ta.getText() + "\n<<<: " + tf.getText());
                    tf.setText("");
                }
            }

        });

        this.c.add(this.sp);
        this.c.add(this.tf);

    @Override
    public void run()
    {
        while(true)
        {
            try
            {
                String input = this.in.readLine();
                System.out.println("warten");
                if(!input.equals(null))
                {
                    this.ta.setText(this.ta.getText() + "\n" + input);
                    this.sb.validate();
                    this.sb.setValue(this.sb.getMaximum());
                }
            } catch (IOException e)
            {
                closeall();
                e.printStackTrace();
                break;
            } catch (NullPointerException e)
            {
                closeall();
                e.printStackTrace();
                break;
            }
        }
    }

    private void closeall()
    {
        try
        {
            this.s.close();
            this.ta.setText(this.ta.getText() + "\n--- Connection lost ---");
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

当我删除评论时

// this.out.println("--- Partner found ---");



在TalkDienst中,该程序将无法工作,并且会显示以下错误消息:左窗口显示TalkDienst,右上角是客户端1,右下角客户端2

Error messages and clients

这是文本格式的请求的错误消息:
TalkServer:
java.net.SocketException: Socket closed
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
        at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
        at sun.nio.cs.StreamDecoder.read(Unknown Source)
        at java.io.InputStreamReader.read(Unknown Source)
        at java.io.BufferedReader.fill(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at TalkDienst.run(TalkDienst.java:40)
java.lang.NullPointerException
        at TalkDienst.run(TalkDienst.java:42)

ChatProgramm 1 :(首先启动)
java.lang.NullPointerException
        at ChatProgramm.run(ChatProgramm.java:131)
        at java.lang.Thread.run(Unknown Source)

聊天程序2:
Exception in thread "Thread-1" java.lang.NullPointerException
        at ChatProgramm.closeall(ChatProgramm.java:156)
        at ChatProgramm.run(ChatProgramm.java:144)
        at java.lang.Thread.run(Unknown Source)

感谢您的帮助,在此先感谢!

最佳答案

println()不会引发异常,包括readLine()引发的异常,因为您已关闭套接字并继续使用它。

您结束流检查也是错误的。常规检查是:

while ((line = in.readLine()) != null
    // ...

关于java - readLine()在聊天程序中引发异常,我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36483848/

相关文章:

python - 为什么我的代码在函数中连接服务器时不起作用,但当我使用 __init__ 调用连接时却工作正常?

c - 错误 : assignment of member ai_family in read-only object

java - 使用 BufferedReader 从文件中读取

java - XAMPP: tomcat不从控制面板启动,只从bat启动

java - MyBatis - IntegerTypeHandler 似乎不起作用

io - DataInputStream.skipBytes(n) 什么时候不能跳过 n 个字节?

C++ 套接字只发送前 4 个字节的数据

java - Java 默认为 BufferedReader 使用什么编码/字符集?

java - 阅读器与缓冲阅读器

java - 'File#renameTo()' 在 Java 中不起作用