【问题标题】:Dealing with EOFException in java在java中处理EOFException
【发布时间】:2015-02-20 19:05:55
【问题描述】:

我有以下功能。我希望循环继续,直到消息等于“您已成功登录!”。但是当用户输入错误的输入(无效的用户名或密码)时,由于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);
    }

【问题讨论】:

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

标签: java exception exception-handling inputstream eof


【解决方案1】:

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

【讨论】:

  • 是的,但如果 eofReached 等于 true,那么如果我得到异常,我将退出循环,我将无法继续从输入中读取
  • 但是如果你已经达到了eof,那么就没有输入可以读取了,所以你已经完成了。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多