扫描程序返回null而不是抛出异常

时间:2013-08-09 15:31:37

标签: java sockets exception networking streaming

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

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

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

2 个答案:

答案 0 :(得分:1)

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

String readLine(boolean ignoreLF)抛出IOException {         StringBuffer s = null;         int startChar;

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

.................. ................ // ----现在,如果连接关闭,读取操作就会启动,它只会返回一个null ---------         bufferLoop:             for(;;){

            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。我希望它能帮助你解决问题。谢谢!

答案 1 :(得分:0)

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

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