我有两个代码块,用于压缩字符串。
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();
}
}
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块的不同放置而发生的。这个的确切行为是什么?
答案 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
并且它已刷新,因此它返回空