为何在finally块关闭资源仍触发SonarQube的ObjectInputStream告警?
问题解答
这不属于误报,你的finally块写法存在两个关键问题,导致SonarQube判定资源未正确关闭:
关闭顺序错误:
ObjectInputStream的close()方法会自动关闭它包装的底层流(即这里的FileInputStream)。你当前先关闭FileInputStream、再关闭ObjectInputStream的顺序是错误的——先关底层流会导致ObjectInputStream关闭时抛出异常,而你又直接吞掉了这个异常,相当于ObjectInputStream没有被正确关闭。异常被静默吞掉:
finally块里的catch (IOException e) {}直接空处理异常,这会掩盖关闭资源时出现的错误,SonarQube会判定这种写法不符合资源关闭的最佳实践。
正确的finally写法示例:
FileInputStream fileInputStream = null; ObjectInputStream objIn = null; try { fileInputStream = new FileInputStream(value); objIn = new ObjectInputStream(fileInputStream); // 此处添加你的业务逻辑代码 } catch (IOException e) { // 处理业务流程中的异常 } finally { // 优先关闭外层的ObjectInputStream,它会自动关闭底层的FileInputStream if (objIn != null) { try { objIn.close(); } catch (IOException e) { // 不要空处理,至少记录异常信息,比如打日志 e.printStackTrace(); } } else { // 若ObjectInputStream未初始化成功,手动关闭FileInputStream if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
调整说明:
- 调整关闭顺序:先关闭ObjectInputStream,利用其自带的流关闭逻辑处理底层流,避免重复关闭引发异常
- 单独处理每个资源关闭的异常:不再静默吞掉异常,至少保留异常记录逻辑
- 增加分支判断:当ObjectInputStream创建失败时,单独关闭FileInputStream
修改后,SonarQube的告警应该会消失。
内容的提问来源于stack exchange,提问作者Billi
相关产品推荐
相关产品推荐

