[英]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.