Java方法返回值错误:应返回ArrayList<Item>而非布尔值
修复你的
loadItems()方法问题 嘿,我来帮你搞定这个代码报错的问题!咱们先拆解一下你代码里的问题:
错误原因分析
你当前的代码有两个关键问题导致报错:
- 返回值类型不匹配:你在while循环里写了
return loadItems().add(newItem),但ArrayList.add()方法返回的是boolean(表示添加是否成功),而你的方法声明要返回ArrayList<Item>,这就导致了类型不兼容的编译错误。 - 递归调用逻辑错误:每次循环都递归调用
loadItems(),会重复打开文件、创建Scanner,完全没法正确收集所有行的Item数据,反而会陷入重复初始化的死循环(直到文件读完,但也没法正确返回列表)。
修正后的代码
正确的思路是先创建一个空的ArrayList,在循环里逐个添加解析好的Item,最后返回这个列表:
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Scanner; // 假设你的Item类是这样的(如果不是,调整字段赋值即可) class Item { String itemName; int itemWeight; } ArrayList<Item> loadItems() throws FileNotFoundException { // 1. 先创建一个空的ArrayList用来存所有Item ArrayList<Item> itemList = new ArrayList<>(); File phaseOneFile = new File("Phase-1.txt"); Scanner readPhaseOneFile = new Scanner(phaseOneFile); while (readPhaseOneFile.hasNextLine()){ String actualLine = readPhaseOneFile.nextLine(); String[] actualLineToItem = actualLine.split("="); // 额外加个判断,避免行格式不正确导致数组越界 if (actualLineToItem.length == 2) { Item newItem = new Item(); newItem.itemName = actualLineToItem[0]; // 可以考虑捕获NumberFormatException,避免转整数失败报错 try { newItem.itemWeight = Integer.parseInt(actualLineToItem[1]); itemList.add(newItem); } catch (NumberFormatException e) { System.out.println("解析重量失败:" + actualLine); e.printStackTrace(); } } else { System.out.println("行格式不正确:" + actualLine); } } // 循环结束后,返回填充好的列表 readPhaseOneFile.close(); // 别忘了关闭Scanner释放资源 return itemList; }
额外优化建议
- 记得关闭
Scanner资源(或者用try-with-resources语法,Java 7+支持),避免资源泄漏:try (Scanner readPhaseOneFile = new Scanner(phaseOneFile)) { // 循环逻辑放在这里,不需要手动close } - 处理
NumberFormatException和数组越界的情况,让代码更健壮,避免因为文件里的一行格式错误导致整个方法崩溃。
内容的提问来源于stack exchange,提问作者Juan CA
相关产品推荐
相关产品推荐

