while 循环中的 ObjectInputStream readObject

ObjectInputStream readObject in while Loop

是否可以在 while 循环中从 ObjectInputStream 读取,该循环将因套接字超时引发的异常而终止 socket.setSoTimeout(4000);

while(Object obj = ois.readObject()) {  <-- Not Working
//do something with object    
}
while(Object obj = ois.readObject()) {  <-- Not Working
//do something with object    
}

当您说 'not working' 时,您真正的意思是 'not compiling',原因在编译器消息中说明:Object 不是 boolean 表达式,并且您不能在 while 条件中声明变量。

然而,代码仍然无效。读取到任意ObjectInputStream流的结尾的正确方法是catch EOFException,例如如下:

try
{
    for (;;)
    {
        Object object = in.readObject();
        // ...
    }
}
catch (SocketTimeoutException exc)
{
    // you got the timeout
}
catch (EOFException exc)
{
    // end of stream
}
catch (IOException exc)
{
    // some other I/O error: print it, log it, etc.
    exc.printStackTrace(); // for example
}

请注意,评论中针对 null 测试 readObject() return 值的建议 正确。它只会 return null 如果你写 null.

这是行不通的,因为 while() 里面写的语句不是布尔表达式,所以我们可以这样写:

Object obj = null;
while ((obj = ois.readObject()) != null) {
//do something with object  
}