gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:55:21 26 4
gpt4 key购买 nike

我编写了一个小型的聊天程序,该程序包含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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com