【发布时间】:2022-01-24 22:48:49
【问题描述】:
Java 8
import java.util.zip.GZIPOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
private void createFile(final String json) throws IOException {
final String fileName = getConfigFileName(this.getSomePath());
GZIPOutputStream out = null;
try {
out = new GZIPOutputStream(new FileOutputStream(fileName + ".gz"));
out.write(json.getBytes());
} catch (IOException e) {
throw e;
} finally {
try {
if (out != null) {
out.finish();
out.close();
}
} catch (IOException e) {
LOGGER.error("createFile: IOException while closing resources", e);
}
}
}
很好。这工作很好。
现在我想用try-with-resource
private void createFile(final String json) throws IOException {
final String fileName = getConfigFileName(this.getSomeFile());
try (GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream(fileName + ".gz"))) {
out.write(json.getBytes());
} catch (IOException e) {
throw e;
} finally {
try {
if (out != null) {
out.finish();
}
} catch (IOException e) {
LOGGER.error("createFile: IOException while closing resources", e);
}
}
}
但现在我在这一行出现错误:
if (out != null) {
错误是:
out cannot be resolved
我知道这个错误是上升的,因为变量 out 在 finally 部分。
但是我如何使用try-with-resources 并执行方法out.finish 呢?
【问题讨论】:
-
1) 您要么必须将其提取到 try-with-resources 块中的变量,例如
GZIPOutputStream out; try ( GZIPOutputStream autoClosedOut = out ) { ... } finally { do-your-out-things }(try-expression 的怪异语法随后在 Java 的更高版本中得到修复) ; 2)或者将finish方法封装到close方法中,使其可以“自动完成”; 3)或者,假设前两个是通用的,确保GZIPOutputStream在关闭时执行finish(必须在源代码右侧的JavaDocs中声明以确保)。
标签: java-8 compiler-errors try-catch-finally try-with-resources