繁体   English   中英

Java尝试使用资源获取错误但继续

[英]Java Try With Resource Getting Error But Continued

以下是我的代码

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而不是在尝试打开套接字时抛出异常?

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

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

在这种情况下它为空,并且在执行 reader.readLine() 时会触发它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM