PMD标记变量为'DU'异常:此Java代码写法存在何问题?
解析PMD的'DU'(定义未使用)异常问题
嘿,这个PMD的'DU'异常我太熟了!它的全称是Defined but Unused(定义但未使用),说白了就是你白忙活了一场——咱们来拆解你的问题:
先看你贴的代码:
private static void summUpBuffer(BufferedReader in) throws IOException { List<String> bufferedData = new ArrayList<>(); for (String line = in.readLine(); line != null; line = in.readLine()) { bufferedData.add(line); } }
问题核心
你创建了bufferedData这个集合,还循环把读取到的每一行都加了进去,但问题是:这个集合后续完全没有被使用——你既没把它返回给调用方,也没传递给其他方法处理,甚至连读取里面的内容都没有。方法执行完后,这个集合就被JVM当作垃圾回收了,相当于做了一堆无意义的操作,这就是PMD给你标红的原因。
这种写法的问题不止是触发PMD警告:
- 浪费内存资源:你把所有行都加载到内存里,最后却不用,纯粹是消耗资源
- 代码意图模糊:其他维护者看到这段代码会一脸懵——收集这些行到底是要干嘛?很容易让人误解你的业务逻辑
修复方案
根据你的实际需求,有几种修复方式:
- 需要返回收集到的行:把方法返回类型改成
List<String>,最后返回集合
private static List<String> summUpBuffer(BufferedReader in) throws IOException { List<String> bufferedData = new ArrayList<>(); for (String line = in.readLine(); line != null; line = in.readLine()) { bufferedData.add(line); } return bufferedData; }
- 需要把数据传递给其他方法处理:循环结束后调用对应的处理方法
private static void summUpBuffer(BufferedReader in) throws IOException { List<String> bufferedData = new ArrayList<>(); for (String line = in.readLine(); line != null; line = in.readLine()) { bufferedData.add(line); } processBufferedData(bufferedData); // 假设这是你用来处理数据的方法 }
- 这段代码本来就是多余的:直接删掉
bufferedData相关的所有代码,避免无效操作
内容的提问来源于stack exchange,提问作者E. Roid




