在 java 中处理 EOFException

Dealing with EOFException in java

提问人:user2735714 提问时间:2/21/2015 最后编辑:DNAuser2735714 更新时间:2/21/2015 访问量:64

问:

我有以下功能。我希望循环继续,直到消息等于“您已成功登录!但是,当用户输入错误的输入(无效的用户名或密码)时,循环会无限循环,因为 .我该如何解决这个问题? 谢谢。EOFException

 private void processConnection() throws IOException
    {
        boolean eofReached = false;
        String message;
        do
        {
            try 
            {
                message = (String)input.readObject();
                if(message.equals("You have successfully logged in!"))
                {
                    displayMessage(String.format("\n%s ", message));
                    logged = true;
                    prepareUI();
                } 
                else
                {
                    displayMessage(String.format("\n%s %s", message, "\nTry again!") );
                }
            } 
            catch (ClassNotFoundException | EOFException  ex) 
            {
                  System.out.printf("\nend of registering");
                //  Logger.getLogger(ClientJFrame.class.getName()).log(Level.SEVERE, null, ex);
                  //eofReached = true;
            }        
             cout("registering");       
        } while(!logged && !eofReached);
    }
Java 异常 inputstream eof

评论

1赞 Sildoreth 2/21/2015
这更像是一种风格选择,但如果使用简单的 while 循环(循环以“while”开头)而不是 do-while 循环,代码会更易于阅读。
0赞 Sildoreth 2/21/2015
你总是收到EOF错误吗?还是只是有时?
0赞 lupus137 2/21/2015
你的“输入”是什么?你能把它包装在 Scanner 中并执行 readLine() 吗?在收到消息之前,它几乎会阻止。因此,您不必轮询和浪费 CPU。
0赞 user2735714 2/21/2015
好吧,如果消息不等于“您已成功登录”,我总是收到EOF异常。而且我不知道我是否可以用扫描仪代替它。我正在响应服务器的应用程序的客户端中使用此函数。实际上,这是我遇到的另一个问题,我什么时候应该选择ObjectInput/Output流而不是Scanner和Formatter

答:

0赞 Sildoreth 2/21/2015 #1

在代码示例中,您似乎拥有了所需的一切。只需取消注释您正在设置的行。eofReached

评论

0赞 user2735714 2/21/2015
是的,但是如果 eofReached 等于 true,那么如果我收到异常,我将退出循环,并且我将无法继续从输入中读取
0赞 Ian McLaird 2/21/2015
但是,如果您已经到达了 eof,那么就没有输入可供阅读了,因此您就完成了。
0赞 user2735714 2/21/2015 #2

好吧,我发现了我的错误。问题在于服务器中没有这样的相应循环来回答所有请求。这就是我得到例外的原因。