Java 在if子句之后代码不起作用
我是网络编程新手,写了一个聊天客户端。它几乎可以工作了,但是当我在.hasnext中突然添加if子句时,即使我的服务器确实发送了一些东西,它也会返回false 加入if条款:Java 在if子句之后代码不起作用,java,if-statement,Java,If Statement,我是网络编程新手,写了一个聊天客户端。它几乎可以工作了,但是当我在.hasnext中突然添加if子句时,即使我的服务器确实发送了一些东西,它也会返回false 加入if条款: @Override public void run() { while(!server.isClosed()){ if(ChatClient.WriteListener.message!=null){ String m = ChatClient.WriteList
@Override
public void run() {
while(!server.isClosed()){
if(ChatClient.WriteListener.message!=null){
String m = ChatClient.WriteListener.message;
out.println(m);
ChatClient.WriteListener.message = null;
}
if(in.hasNext()){
System.out.println("hab");
String message = in.next();
textPane.setText(textPane.getText()+"\n"+message.replaceAll("_", " "));
}
out.flush();
}
System.out.println("closed");
}
无if条款
public void run() {
while(!server.isClosed()){
out.println(ChatClient.WriteListener.message);
if(in.hasNext()){
System.out.println("hab");
String message = in.next();
textPane.setText(textPane.getText()+"\n"+message.replaceAll("_", " "));
}
}
System.out.println("closed");
}
创建输入和输出:
public UserThread(Socket s){
server = s;
try {
out = new PrintWriter( server.getOutputStream(), true );
in = new Scanner( server.getInputStream() );
} catch (IOException e) {
e.printStackTrace();
}
}
书写员
public static class WriteListener implements ActionListener {
JTextField text;
static String message;
public WriteListener(JTextField jtf){
text = jtf;
}
public void actionPerformed(ActionEvent ev) {
message = text.getText();
}
}
代码中的问题如下:
if (ChatClient.WriteListener.message!=null){
String m = ChatClient.WriteListener.message;
out.println(m);
ChatClient.WriteListener.message = null;
}
您的out
是实例PrintWriter(OutputStream out,boolean autoFlush)
。当您在第一个ifPrintWriter语句中调用out.println(m)
时,会刷新套接字上的缓冲区/流,导致第二个if(in.hasNext())
语句返回false
,因为来自套接字的I/O被PrintWriter
自动关闭。您需要从PrintWriter
的初始化中更改/删除true
,如下所示:
try {
out = new PrintWriter( server.getOutputStream());
in = new Scanner( server.getInputStream() );
} catch (IOException e) {
e.printStackTrace();
}
JavaDoc:ChatClient.WriteListener.message=null代码>你为什么这样做?在
中什么是?它是如何创建的?请在in
和out
@zron中添加创建的代码,这样它就不会被再次发送。您是否已将参数更改为false,而不仅仅是删除参数?当您说“它在没有if子句的情况下工作”它清楚地表明您正在if语句中执行某些更改/关闭套接字流的操作。唯一正在做某事的是out.println(m)
,所以这可能就是问题所在,除非您的WriteListener
包含一些逻辑。我的最佳猜测是,在尝试访问输入流之前,您正在关闭套接字连接,因此
流中的为空。尝试删除out.println(m)
语句,看看它是否有效。如果是这样的话,我想这就是问题所在。尝试使用不同的输出,而不是PrintWriter
@MichaelDD我的意思是,如果我不检查ChatClient.WriteListener.message=null如果我的问题中没有if子句,你看我的代码,这听起来很愚蠢,我知道,我只是坐在这里思考WriteListener
内部ChatClient
的wtfAdd代码,这样我们可以看看监听器内部是否有一些逻辑可能关闭流