ServerSocket.close()。它什么时候会抛出异常?

3

我已经思考了很长时间,也一直在捕获可能抛出的ServerSocket.close()异常,但是从未见过它抛出异常。

Javadocs中写道:

Throws:
    IOException - if an I/O error occurs when closing the socket.

然而,正如我所说的,我从未见过它抛出异常。在什么情况下关闭serversocket时会发生I/O错误?您可以假设手头的代码看起来像这样:

public void terminate() {
    try {
        serverSocket.close();
    } catch (IOException ex) {
        System.err.println(ex.getMessage()); // when and how?
    }
}

我已经在互联网上搜索了答案,但没有找到任何能够澄清这个问题的东西。


@OlaviMustanoja 这真的取决于实现方式。有许多套接字实现,它们可能各自具有独立的错误。此外,IOException 相当广泛,似乎更像是一种实现方式抛出任何 I/O 基础错误并使其得到正确处理的方法。 - Obicere
@Obicere 我理解这个。我问的是,ServerSocket.close() 什么时候会抛出 IOException?我不关心其他许多实现。 - Olavi Mustanoja
@OlaviMustanoja 确切地说,就是在指定的时间发生。确实取决于 SocketImpl 的实现:IOException - 如果在关闭此套接字时发生 I/O 错误。 - Obicere
@Obicere,你能详细解释一下吗?我的意思是你能否提供一个示例,在哪种情况下ServerSocket.close()会抛出异常?如果在关闭此套接字时发生I/O错误,则会引发IOException异常,但是如果实际上从未发生I/O错误,这并不意味着任何事情,这意味着我被迫捕获一个不存在的异常,因此我认为这是不好的。 - Olavi Mustanoja
我认为可能性之一是,在关闭套接字时连接丢失,或者关闭连接的数据包丢失了。虽然我不完全确定,因为任何测试都需要良好的时机。(在相关主题上,BufferedReader曾经存在一个错误,即在关闭失败时不会抛出异常 - 它是通过在程序关闭流时拔下可拆卸设备进行测试的。在您的情况下,最好执行类似的测试,因为您不会通过拔掉连接来砖块化您的网络适配器) - nhahtdh
1
@OlaviMustanoja 这不是一个 RuntimeException。如果由于任何原因可能抛出它,那么需要正确地处理它。当然,也许默认实现不会抛出异常。但是,假设我制作了自己的实现,并且希望在用户名称中有“e”时抛出 IOException。即使这种行为似乎多余,也需要明确涵盖此类行为。存在使用场景,因此才被添加。 - Obicere
1个回答

3
当您尝试关闭一个已经关闭的套接字时,会抛出 IOException 异常。

1
无法确认此行为:调用两次 socket.close() 不会抛出异常(Java8)。 - Heri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接