【问题标题】:Try with resource for both inputstream and errorstream尝试使用输入流和错误流的资源
【发布时间】:2017-02-27 09:40:03
【问题描述】:

当涉及到getInputStreamgetErrorStream 时,我如何使用try with resource 来覆盖所有角落

HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
BufferedReader bufferedReader;
if(connection.getResponseCode() == 200) {
    bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
} else {
    bufferedReader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
}

String line;
StringBuilder result = new StringBuilder();
while((line = bufferedReader.readLine()) != null) {result.append(line);}
bufferedReader.close();

if(connection.getResponseCode() != 200) {
    throw new Gson().fromJson(result.toString(), FooException.class);
} else {
    return new Gson().fromJson(result.toString(), Foo.class);
}

【问题讨论】:

  • “覆盖所有角落”是什么意思?
  • 我想在关闭连接和缓冲阅读器之前以一种涵盖结果和错误处理的方式对资源进行尝试
  • 你将如何使用 try with resource 来处理上述代码?

标签: java try-with-resources


【解决方案1】:

如果我理解您的问题,那么您可以使用三元运算符? :try-with-resources 中构造您的BufferedReader。另外,我会将responseCode 保存到局部变量中。比如,

StringBuilder result = new StringBuilder();
int responseCode = connection.getResponseCode();
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
        responseCode == 200 ? connection.getInputStream() 
        : connection.getErrorStream()))) {
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        result.append(line);
    }
}
if (responseCode != 200) {
    throw new Gson().fromJson(result.toString(), FooException.class);
} else {
    return new Gson().fromJson(result.toString(), Foo.class);
}

【讨论】:

  • 好吧,看起来更好,为什么你建议使用本地变量作为响应代码?
  • 为什么要多次调用connection.getResponseCode()
  • @User794691 可能。仍然涉及通过引用调用它的方法调用。而且你需要它两次,所以你不妨保存它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2021-11-19
  • 2018-05-30
  • 2018-07-22
  • 2023-04-08
  • 1970-01-01
  • 2021-05-29
相关资源
最近更新 更多