Java 捕获IOException时如何关闭ServerSocket连接?
很抱歉提这个问题,但我完全不懂Java。当从Java 捕获IOException时如何关闭ServerSocket连接?,java,sockets,Java,Sockets,很抱歉提这个问题,但我完全不懂Java。当从ServerSocket捕获到IOException时,执行ServerSocket.close()的最佳实践是什么?根据文档,ServerSocket.close()抛出IOException,编译器要求我们捕获它。在IOException上关闭连接的正确方法是什么 try { server = new ServerSocket(this.getServerPort()); while(true) { socket =
ServerSocket
捕获到IOException
时,执行ServerSocket.close()
的最佳实践是什么?根据文档,ServerSocket.close()
抛出IOException
,编译器要求我们捕获它。在IOException
上关闭连接的正确方法是什么
try {
server = new ServerSocket(this.getServerPort());
while(true) {
socket = server.accept();
new Handler( socket );
}
} catch (IOException e) {
if (server != null && !server.isClosed()) {
server.close(); //compiler do not allow me to do because I should catch IOExceoption from this method also...
}
}
谢谢大家! 这在Java中很难看。我讨厌它,但你应该这样做:将它包装成另一个try catch:
try {
server = new ServerSocket(this.getServerPort());
while(true) {
socket = server.accept();
new Handler( socket );
}
} catch (IOException e) {
if (server != null && !server.isClosed()) {
try {
server.close();
} catch (IOException e)
{
e.printStackTrace(System.err);
}
}
}
您可以关闭finally块中的资源
如果您打算在try{}catch{}之外关闭ServerSocket,那么您可以将其放入finally{}
try {
server = new ServerSocket(this.getServerPort());
while(true) {
socket = server.accept();
new Handler( socket );
}
} catch (IOException e) {
// Do whatever you need to do here, like maybe deal with "socket"?
}
finally {
try {
server.close();
} catch(Exception e) {
// If you really want to know why you can't close the ServerSocket, like whether it's null or not
}
}
在JavaSE7或更高版本中,您可以使用,
ServerSocket实现Java.io.Closeable
,因此以这种方式使用套接字时不需要显式地#close()
try (ServerSocket server = new ServerSocket(this.getServerPort())) {
while(true) {
socket = server.accept();
new Handler( socket );
}
} catch (IOException e) {
// It's already closed, just print the exception
System.out.println(e);
}
是的,没错。但它仍然无法编译,因为它可能引发IOException。这没有意义。编译器还将要求从
ServerSocket.close()
捕获IOException
。确实,您仍然应该使用try-catch来包装它。这真是太糟糕了!。谢谢你的回答,它非常有用!注意,在Java7中使用参考资料的新尝试。谢谢,我已经完成了。看起来糟透了。
try (ServerSocket server = new ServerSocket(this.getServerPort())) {
while(true) {
socket = server.accept();
new Handler( socket );
}
} catch (IOException e) {
// It's already closed, just print the exception
System.out.println(e);
}