Java代码Sonar问题咨询:处理delete()返回值后代码受影响
搞定Sonar提示+代码运行异常的问题
先搞懂问题根源
Sonar那个提示说白了就是:delete()返回的布尔值是告诉你删没删成,不能假装看不见。你加了日志之后代码出问题,大概率是这俩原因:
- 之前不管删没删成,程序都接着往下跑;现在删失败只打了日志,后续逻辑没考虑“目录还在”的情况,自然出问题。
- 你可能没注意,
File.delete()碰到非空目录直接返回false,根本不会删,这种情况光判断返回值没用。
按业务场景选正确解法
1. 删不掉就不能继续:直接抛异常
如果这个目录必须删掉才能走下一步(比如临时文件清理),删失败就抛异常让上层处理,别硬撑:
if (!directory.delete()) { throw new IOException("删目录失败:" + directory.getAbsolutePath()); }
既满足Sonar的要求,又能及时终止错误流程,避免后续逻辑踩坑。
2. 删不掉也没关系:适配后续逻辑
如果删除不是必须的(比如清理历史日志),除了打日志,还要确保后续代码不默认目录已经没了:
boolean deleteOk = directory.delete(); if (!deleteOk) { logger.warn("删目录失败:{}", directory.getAbsolutePath()); } // 后面要是还要碰这个目录,先判断存不存在 if (directory.exists()) { // 处理目录还在的情况,比如跳过或者再次尝试删除 }
3. 目录非空的情况:递归删干净
File.delete()不处理非空目录,所以得先删里面的文件和子目录,再删空目录:
private boolean deleteDir(File dir) { File[] files = dir.listFiles(); if (files != null) { for (File f : files) { if (!deleteDir(f)) { return false; } } } boolean deleted = dir.delete(); if (!deleted) { logger.error("删目录失败:{}", dir.getAbsolutePath()); } return deleted; } // 调用的时候用这个方法就行 deleteDir(directory);
这种方法能覆盖大部分删除失败的场景,同时满足Sonar对返回值的要求。
为啥你之前的修改会出问题?
你只加了日志,没处理后续逻辑。比如原来删完就直接操作父目录,或者默认目录已经没了,但实际上删失败后目录还在,后续代码自然会碰到“文件已存在”“无法创建”之类的异常。所以必须根据业务需求,要么删失败就停,要么适配目录还在的情况,要么把删除逻辑补全。
内容的提问来源于stack exchange,提问作者Mahi Mokhashi
相关产品推荐
相关产品推荐

