Java 在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

我是网络编程新手,写了一个聊天客户端。它几乎可以工作了,但是当我在.hasnext中突然添加if子句时,即使我的服务器确实发送了一些东西,它也会返回false

加入if条款:

    @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)
。当您在第一个
if
PrintWriter
语句中调用
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代码,这样我们可以看看监听器内部是否有一些逻辑可能关闭流