基本上,我没有使用任何Java API类,如ArrayLists或LinkedLists,因为我创建了自己的自定义链表类,在本例中名为FoodList。我正在尝试找出一种方法来从每行都是对象的文件中读取每一行,并将其存储在 FoodList 中。
我看过许多在线阅读文件的示例,但没有一个是针对自定义链表的。
package lab9;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;
public class Console {
FoodList x = new FoodList();
public Console(){
this.x = new FoodList();
}
public void Display() {
System.out.println("============================================================================");
System.out.println("Name Food Group Calories Daily percentage ");
System.out.println("============================================================================");
File f = new File("food.txt");
try {
Scanner scan = new Scanner(f); //What I tried to do to read in objects from file
while(scan.hasNextLine()){
String line = scan.nextLine();
String[] details = new String[4];
details = line.split(" ");
String name = details[0];
String group = details[1];
int calories = Integer.parseInt(details[2]);
double percentage = Double.parseDouble(details[3]);
x.add(new Food(name, group, calories, percentage));
}
System.out.println(x);
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("Not working");
}
}
}
下面的代码也给了我第 30 行的越界异常。我应该尝试以不同的方式读取对象还是解决此问题?
注意:请不要将其标记为重复项,我已经使我的 String[] 详细信息变量容纳超过 1 个数组。
这最初是作为 导致 java.lang.ArrayIndexOutOfBoundsException 的 dup 关闭的,我该如何防止它?
这至少回答了部分问题。 您得到了该异常,并且 dup确实解释了导致异常的原因,尽管它没有解决特定代码的细节。
(旁白:有很多人,包括我,认为像这样的问题,OP希望其他人调试他们的代码,最好通过将OP指向某个地方,提供他们自己找到解决方案所需的信息。 直接为 OP 解决问题剥夺了 OP 自己寻找解决方案的学习练习,并导致人们在实际上不知道如何为自己解决编程问题的情况下获得资格。
然后你这样说:
注意:请不要将其标记为重复项,我已经使我的 String[] 详细信息变量容纳超过 1 个数组。
(这是一个重复的...根据这通常意味着重复!
这是错误的解决方法。 1)这意味着您没有使用提供的线索来了解问题的真正含义。 2) 这也意味着对分配数组时会发生什么的重大误解。
回过头来,下面是诊断和解决问题的逻辑过程:
问:发生了什么事?
答:有一个例外。
问:例外是什么意思?
答:阅读javadocs,谷歌一下。
问:您从哪里得到异常?
答:您可以从堆栈跟踪(行号)和查看代码中获取它。
问:为什么会出现异常?
答:异常消息和引发异常的行中会有线索。 在这种情况下,它会说您试图访问长度为零的数组的元素零。 我假设您没有添加/删除行,第 30 行是这个:
String name = details[0];
显然,您无法访问空数组的第零个元素。 (为什么? 查看您对数组的注释以及它们的索引方式!
这为您提供了两件事:
- 为什么数组的长度为零?
- 为什么要尝试访问零长度(空)数组的元素?
第一个可以通过通读javadoc forString::split
来回答,并思考一下。 您尝试拆分的行一定是空的。 (如果其中有任何非空白字符,数组的长度将>为零,并且您不会在第 30 行出现异常。
如果您仔细查看输入文件,您应该能够发现空行。 (它可能在文件的末尾。 我的猜测是你的问题的要求提到了空行。 (他们应该。
第二个很简单。 您没有考虑输入中空行的可能性,这将为您提供一个空数组。 代码假定数组为非空数组。
问:你如何解决它?
答:您需要知道在每种情况下您希望发生什么。 然后你编写代码来实现它。 以下是几种策略:
- 修剪每行(以删除无关的前导/尾随空格)并测试生成的字符串的长度是否为零。 如果是,请跳过该行。
- 拆分行,并检查数组中有多少个元素。 如果数字不是 4,请执行适当的操作。 (跳过该行,报告错误,随便什么。 你决定。
然后测试它。
前面我说过:
这是错误的解决方法。 ...2) 这也意味着对分配数组时会发生什么的重大误解。
String line = scan.nextLine();
String[] details = new String[4]; // <<-- supposed fix
details = line.split(" ");
数组赋值实际上是一个引用赋值。 因此,修复后的行将用split
调用创建的新数组替换您创建的 4 元素数组。 数组很可能具有不同的长度。 它肯定会是一个不同的阵列。
简而言之,该修复实际上没有任何效果。