首页 > 解决方案 > Java尝试资源获取错误但继续

问题描述

以下是我的代码

try (Socket socket = new Socket(hostname, port); InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {
    while ((line = reader.readLine()) != null) {
        // my code here
    }
} catch (UnknownHostException ex) {
    ex.printStackTrace();
} catch (SocketException ex) {
    ex.printStackTrace();
} catch (IOException ex) {
    ex.printStackTrace();
}

我将它作为多线程运行,一些线程得到这些错误

java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
    at sun.nio.cs.StreamDecoder.read(StreamDecoderI.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.io.BufferedReader.readLine(BufferedReader.java:324)
    at java.io.BufferedReader.readLine(BufferedReader.java:389)

根据该跟踪,错误来自BufferedReader.readLine. 作为调查,我手动连接到该代码中使用的 IP 地址,发现实际上该 IP 地址处于脱机状态。所以我认为不可能打开该 IP 地址的套接字。

我的问题是,如果我们无法打开该 IP 地址的套接字,为什么我的代码会继续运行,直到BufferedReader.readLine尝试打开套接字时才抛出异常?

标签: javasockets

解决方案


InputStream 输入 = socket.getInputStream(); 这里输入的值为空,因为无法将套接字连接到提供的主机端口。

当您执行 reader.readLine() 时,它使用下划线流 InputStreamReader() 读取字节码并将其转换为字符流。现在底层流(InputStreamReader)从套接字读取字节流。在从底层套接字读取数据之前,InputStreamReader 类使用方法 ensureOpen() 检查底层套接字是否不为空,如果为空则抛出 IOException。

在本例中,它为 null,并且在执行 reader.readLine() 时触发。


推荐阅读