【问题标题】:SocketTimeoutException indicated as unreachableSocketTimeoutException 指示为无法访问
【发布时间】:2015-10-20 18:34:28
【问题描述】:

以下是我正在尝试编写的 Java 应用程序的一小部分:

Socket socket = new Socket(hostname, portnumber);
DataInputStream socketInput = new DataInputStream(socket.getInputStream());
try{
    socket.setSoTimeout(10000);
    try{
        byte[] msgHeader = new byte[4];
        if (socketInput.read(msgHeader) != -1)
        {
            // process message
        }
    }
    catch (IOException e)
    {
        // process exception
    }
    catch (SocketTimeoutException ste)
    {
        // process exception
    }
}
catch (SocketException se)
{
    // process exception
}

我收到一条错误消息,指出无法访问 catch(SocketTimeoutException)。我想建立一个套接字超时以防止套接字 read() 永远阻塞,如果发生 SocketTimeoutException,我的应用程序将尝试建立到下一个可用服务器的套接字连接并尝试相同的 read() 操作。

非常感谢您提供的任何帮助,因为我尝试使用不同的 IO 类都没有成功。

【问题讨论】:

    标签: java


    【解决方案1】:

    由于SocketTimeoutExceptionIOException 的子类,因此控制永远不会到达正在捕捉SocketTimeoutException 的catch 块。异常将始终被 IOException 捕获块捕获 改变那些 catch 块的位置:

     catch (SocketTimeoutException e)
        {
            // process exception
        }
        catch (IOException ste)
        {
            // process exception
        }
    

    【讨论】:

    • 感谢您的快速回复/响应。在查看您的回复/回复并删除我的问题之前,我意识到了我的问题。不过,我非常感谢您的回复。
    【解决方案2】:

    the javadoc:SocketTimeoutException 扩展了 IOException。因此,如果在 try 块中抛出一个,它将被第一个 catch 块捕获,因此永远不会到达第二个。

    把两个catch块的顺序颠倒一下,一切都应该没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 2018-04-16
      • 2020-06-25
      • 1970-01-01
      • 2011-12-02
      相关资源
      最近更新 更多