Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 捕获IOException时如何关闭ServerSocket连接?_Java_Sockets - Fatal编程技术网

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

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 =

很抱歉提这个问题,但我完全不懂Java。当从
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);
}