我在java中遇到网络问题。我试图通过套接字从客户端读取消息。我使用BufferedReader来阅读消息。
public String read() throws IOException {
String message = reader.readLine();
return message;
}
当我在服务器上的reader.readline()方法上时,如果客户端终止连接,我实际上会遇到错误。但是,它不是抛出异常,而是返回NULL。
答案 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;
}