java - 尝试内和尝试后返回位置时的不同行为

标签 java outputstream try-catch-finally finally try-finally

我有以下两个代码块,我用它们来压缩字符串。

代码1

public static String compressResponse(String response) throws IOException {

    Deflater deflater = new Deflater(Deflater.DEFLATED, true);
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream, deflater);
    try {
        deflaterOutputStream.write(response.getBytes(StandardCharsets.UTF_8));
        return Base64.encodeBytes(byteArrayOutputStream.toByteArray(), Base64.DONT_BREAK_LINES);
    } finally {
        deflaterOutputStream.close();
    }
}

代码2

 public static String compressResponse(String response) throws IOException {

    Deflater deflater = new Deflater(Deflater.DEFLATED, true);
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream, deflater);
    try {
        deflaterOutputStream.write(response.getBytes(StandardCharsets.UTF_8));
    } finally {
        deflaterOutputStream.close();
    }
    return Base64.encodeBytes(byteArrayOutputStream.toByteArray(), Base64.DONT_BREAK_LINES);
}

只有第二种方法可以正常工作,而第一种方法始终返回空字符串。我理解这种不同的行为是由于返回 block 相对于finally block 的不同放置而发生的。其具体行为是什么?

最佳答案

在第二个示例中,byteArrayOutputStream 被填充,因为 deflaterOutputStream 已关闭并刷新

关于java - 尝试内和尝试后返回位置时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36812105/

相关文章:

java - 我通过套接字发送的 int 值与接收到的 int 值不同(Java)

java - ServletOutputStream.write 有时会抛出索引越界

FFMPEG 来自 BlackMagic 输入的多个输出

java - java中的try-catch-finally

Java:求二维数组的总和

java - 通过gradle配置JOOQ Codegen时找不到H2驱动程序

java 将项目从数据库添加到 JcomboBox

java - JMeter 结果的小组响应

java - 将资源作为类成员尝试使用资源

java - 在 Java 中阻止 Final block 执行的有效命令