尝试

时间:2016-04-23 14:32:32

标签: 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);
}

只有第二种方法才能正常工作,其中第一种方法总是返回一个空字符串。我理解这种不同的行为是由于返回块相对于finally块的不同放置而发生的。这个的确切行为是什么?

3 个答案:

答案 0 :(得分:2)

在第二个示例byteArrayOutputStream上填充,因为deflaterOutputStream已关闭且已刷新

答案 1 :(得分:0)

原因是因为在第一种方法中,在执行deflaterOutputStream.close();之前执行return语句,而第二种方法首先执行关闭操作

deflaterOutputStream在关闭连接时将数据写入byteArrayOutputStream。在deflaterOutputStream关闭之前,byteArrayOutputStream不包含数据。

答案 2 :(得分:-1)

即使您在try块中放置了return语句,您的finally块也会执行,finally块的功能是,

  

如果引发异常或未引发异常,即使引发或处理异常,然后执行finally阻止,如果将system.exit()放在try中,最终阻止也不会执行或catch阻止

在您的代码中

try{
return------> this wont return instead finally block will execute
}
finally{
//
}

你的关闭DeflaterOutputStream并且它已刷新,因此它返回空