当我运行它时,我得到一个数组超出范围的异常。我需要在CSV中读取包含每行中学生信息的ArrayList。我还需要能够检查行是否缺少信息或信息太多,并丢弃它所执行的整行。我觉得我可能完全错了,因为我不完全确定如何做到这一点。 我的主要课程是
public class Main {
static ArrayList<Student> Students = new ArrayList<Student>();
public static void main(String[] args) throws IOException {
String fileLocation = getFile();
File file = new File(fileLocation);
while(!file.exists()) {
fileLocation = getFile();
}
Scanner scnr = new Scanner(fileLocation);
while (scnr.hasNextLine()) {
String data[] = scnr.nextLine().split(",");
Students.add(new Student(data[0], data[1], data[2], data[3]));
}
}
public static String getFile() throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter file location: ");
String fileLocation = reader.readLine();
System.out.println(fileLocation);
return fileLocation;
}
}
我的学生班
public class Student {
public String fName = "";
public String lName = "";
public String logonID = "";
public String randomNumber = "";
public Student (String fName, String lName, String logonID, String randomNumber) {
this.setName(fName, lName);
this.setID(logonID);
this.setNumber(randomNumber);
}
public Student() {
fName = "";
lName = "";
logonID = "";
randomNumber = "";
}
public void setName(String firstName, String lastName) {
this.fName = firstName;
this.lName = lastName;
}
public void setID(String studentID) {
this.logonID = studentID;
logonID.toLowerCase();
}
public void setNumber(String randomNumber) {
this.randomNumber = randomNumber;
}
}
我得到的错误是“线程中的异常”主“java.lang.ArrayIndexOutOfBoundsException:1 在Main.main(Main.java:23)“
安德鲁,逗号,comma1aj,83559,
安德鲁,Karpenter,karpe1aj,966796,15.7
布兰登,萝卜,turni1bw,715855,
布伦达,味噌,miso1b,747747,
克里斯,擦鞋,shie1c,123784,
大卫,酷派,Cool1d,200100,
Django的,, uncha1d,830700,
埃里克,塔塔,, 400500,
雅各布,杜利特尔,dooli1j,555777,
托马斯·杰斐逊,jeff1t,951753,
卡亚,咖啡,coffee1k,789456,
欧文·威尔逊,wilso1o,456123,
测试,学生,seeli1p_s ,,
,演示,demo1s,58578,
答案 0 :(得分:1)
在处理这些问题时,您应该首先输入一些调试语句。
首先修改&#34;阅读&#34;代码的一个方面,提供有关已阅读内容的更多详细信息,例如......
Scanner scnr = new Scanner(fileLocation);
while (scnr.hasNextLine()) {
String text = scnr.nextLine();
System.out.println("text = " + text);
String[] data = text.split(",")
System.out.println("data = " + data.length);
Students.add(new Student(data[0], data[1], data[2], data[3]));
}
您需要验证已读入的文本至少包含4个元素。这将有助于您确定可能会给您带来问题的文本行
好的,我试过了,文本打印了我输入的文件位置。数据长度为1,然后我得到了例外。
Scanner(String)
将您提供的String
作为要处理/扫描的值。相反,您需要Scanner(File)
,它将读取您指定的文件。
所以,而不是Scanner scnr = new Scanner(fileLocation);
尝试使用Scanner scnr = new Scanner(new File(fileLocation));
好的,修好它,我现在得到我想要的输出,除了最后一个&#34;学生&#34;。我得到了另一个数组超出界限的例外,最后一个学生应该打印出来,而且我在线程中也有一个例外&#34;主要&#34;对于&#34;学生的文本输出之一&#34;具有正确数量的信息。当我点击超链接的异常时,它表示找不到Chris,Shoe,shie1c,123784,Exception的来源。检查正确数量的数据条目会解决这个问题吗?
因此基于您的示例代码,Test,student,seeli1p_s,,
生成的数组只有3个元素。显然String#split
默认删除空元素(即,,
生成一个空元素,而split
正在删除它。)
要解决此问题,您需要提供-1
至String#split
的{{1}}参数,例如......
limit
答案 1 :(得分:0)
Students.add(new Student(data[0], data[1], data[2], data[3]));
该行是否导致异常。相反,您应首先检查数据是否包含4个元素,如果不包含,请不要按照主题中的说明添加学生。
答案 2 :(得分:0)
对于初学者,您应该将file
传递给Scanner
而不是fileLocation
。这将使扫描程序能够读取整个文件。此外,在建立新位置后更新文件,否则循环可能永远不会结束。例如:
File file = new File(fileLocation);
while(!file.exists()) {
System.out.println("The chosen file doesn't exist, please select another") ;
fileLocation = getFile();
file = new File(fileLocation);
}
Scanner scnr = new Scanner(file) ;
现在开始填写清单。在尝试访问它们之前,必须确保所有元素都存在。我可以想到两个选择:
<强> 1。通过try和catch(不推荐)来围绕代码。
Scanner scnr = new Scanner(file);
while (scnr.hasNextLine()) {
String data[] = scnr.nextLine().split(",");
try{
Students.add(new Student(data[0], data[1], data[2], data[3]));
} catch(Exception e) {
e.printStacktrace() ;
}
}
<强> 2。验证数据数组
Scanner scnr = new Scanner(file);
while (scnr.hasNextLine()) {
String data[] = scnr.nextLine().split(",");
if(data.length !=4 || data[0].isEmpty() ||
data[1].isEmpty() || data[2].isEmpty() || data[3].isEmpty() ){
// may add additional checks
continue; //goes to next iteration
}
Students.add(new Student(data[0], data[1], data[2], data[3]));
}