如何在捕获IOException时关闭ServerSocket连接?

Kir*_*lla 3 java sockets

对不起,问题,但我在Java中完全是noob.什么是执行最佳实践ServerSocket.close()抓时IOExceptionServerSocket?根据文档,ServerSocket.close()throws 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...
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Jon*_*Lin 8

如果你打算在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
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*aux 7

这在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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 注意,新的尝试使用Java 7中的资源. (2认同)
  • 谢谢,我[见](http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)它.看起来很糟糕. (2认同)

Lei*_*ldt 5

在Java SE 7或更高版本可以使用的try-与资源声明ServerSocket implements 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);
}
Run Code Online (Sandbox Code Playgroud)