【问题标题】:Scanner returns null instead throwing an exceptionScanner 返回 null 而不是抛出异常
【发布时间】:2013-08-09 15:31:36
【问题描述】:

我在使用 java 网络时遇到问题。我试图通过套接字从客户端读取消息。我使用 BufferedReader 来阅读消息。

public String read() throws IOException {
    String message = reader.readLine();
    return message;
}

当我使用服务器上的 reader.readline() 方法时,如果客户端终止连接,我实际上预计会出现错误。但是,它不会抛出异常,而是返回 NULL。

【问题讨论】:

  • 那是因为服务器返回null,检查if(message == null)然后杀死客户端。
  • Scanner 没有 readLine() 方法。这似乎是一个 BufferedReader 方法,如果已到达流的末尾,则返回 null
  • @DummyCode 所以当我得到 IOexception 时,如果它不能那样工作?
  • @Eray Tuncer “到达流的末尾”意味着如果您正在从底层文件读取,则为文件末尾。因此,在 readLine() 方法的情况下,它返回 - 一个包含行内容的字符串,不包括任何行终止字符,如果已经到达“流的结尾”,则返回 null
  • 它应该在read()运行之前被杀死。

标签: java sockets exception networking streaming


【解决方案1】:

@Eray Tuncer 这取决于连接何时关闭,如果它是在开始读取该行之前,那么是的,你应该期待一个异常。但如果它在阅读之间,我认为你会得到“null”,表示流结束。请检查 BufferedReader 中 readLine 的以下实现:

String readLine(boolean ignoreLF) 抛出 IOException { 字符串缓冲区 s = null; int startChar;

    synchronized (lock) {
        ensureOpen(); //This method ensures that the stream is open and this is called before start reading

....... ...... //----现在开始读取操作,如果连接关闭它只会返回一个空值--------- 缓冲循环: 对于 (;;) {

            if (nextChar >= nChars)
                fill();
            if (nextChar >= nChars) { /* EOF */
                if (s != null && s.length() > 0)
                    return s.toString();
                else
                    return null;
            }
            boolean eol = false;
            char c = 0;
            int i;

            /* Skip a leftover '\n', if necessary */
            if (omitLF && (cb[nextChar] == '\n'))
                nextChar++;
            skipLF = false;
            omitLF = false;

        charLoop:
            for (i = nextChar; i < nChars; i++) {
                c = cb[i];
                if ((c == '\n') || (c == '\r')) {
                    eol = true;
                    break charLoop;
                }
            }

            startChar = nextChar;
            nextChar = i;

            if (eol) {
                String str;
                if (s == null) {
                    str = new String(cb, startChar, i - startChar);
                } else {
                    s.append(cb, startChar, i - startChar);
                    str = s.toString();
                }
                nextChar++;
                if (c == '\r') {
                    skipLF = true;
                }
                return str;
            }

            if (s == null)
                s = new StringBuffer(defaultExpectedLineLength);
            s.append(cb, startChar, i - startChar);
        }
    }
}

所以底线是您应该在此操作中检查 null,而不是依赖 IOException。我希望它能帮助你解决你的问题。谢谢!

【讨论】:

    【解决方案2】:

    您可以像这样手动触发异常:

    public String read() throws IOException {
        String message = reader.readLine();
        if (message == null)
            throw new IOException("reader.readLine() returned null");
        return message;
    }
    

    【讨论】:

    • 谢谢先生,但真正的问题是我是否应该期待 readline() 行出现异常。
    猜你喜欢
    • 2018-07-27
    • 2012-12-22
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2010-12-05
    • 2019-03-03
    相关资源
    最近更新 更多