java - 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
尝试打开套接字时才抛出异常?
解决方案
InputStream 输入 = socket.getInputStream(); 这里输入的值为空,因为无法将套接字连接到提供的主机端口。
当您执行 reader.readLine() 时,它使用下划线流 InputStreamReader() 读取字节码并将其转换为字符流。现在底层流(InputStreamReader)从套接字读取字节流。在从底层套接字读取数据之前,InputStreamReader 类使用方法 ensureOpen() 检查底层套接字是否不为空,如果为空则抛出 IOException。
在本例中,它为 null,并且在执行 reader.readLine() 时触发。
推荐阅读
- sql-server - DB:waitresource 在 sys.sysprocesses 中是什么意思?
- atom-editor - Atom 编辑器无法安装软件包
- android - 并非图层列表中的所有项目都显示
- python - urllib.error.HTTPError:HTTP 错误 503:服务不可用 python
- php - Woocommerce 产品价格过滤器不起作用
- php - 使用 PHP 基于动态下拉选择填充表单字段
- c++ - 更改为 c++ 时卡在 while 循环中
- excel - Excel Power 中的 MDX 表达式使用 = 运算符
- mysql - 根据 MySQL 5.6 和 ORACLE 11 和 ORACLE 12 中的现有列填充列
- laravel - 无法在 Laravel 5.5 上更新