所以我试图从文本文件创建一个对象数组。我放在数组中的对象是具有4个参数的人物对象。名字,姓氏,身份证号码和身高。文本文件具有一定数量的行,每个元素由感叹号分隔。我试图采取4个元素中的每一个来创建一个对象,然后将该对象放入一个对象数组。这是我的代码,直到现在。另外因为我是java的新手,所以我所知道的并不多,所以代码需要简单。
import java.io.File;
import java.io.IOException;
import java.util.*;
public class Participants {
public static void main(String[] args) {
String array[] = new String[35];
Object participants[] = new Object[35];
int count = 0;
int counter = -1;
try {
File myFile1 = new File("Participants.txt");
Scanner scan1 = new Scanner(myFile1);
while (scan1.hasNext()) {
counter++;
array[counter] = scan1.next();
}
} catch (IOException ioe) {
System.out.println("The file can not be read");
}
for (int i = 0; i < array.length; i++) {
StringTokenizer st = new StringTokenizer(array[i], "!");
while (st.hasMoreTokens()) {
People person = new People(st.nextToken(), st.nextToken(), st.nextToken(),
st.nextToken());
participants[i] = person;
}
}
}
}
答案 0 :(得分:0)
我评论说你的代码基本上看起来还不错。我发现了一些问题,我想你可能会碰到它们。你可能得到了一个
Exception in thread "main" java.lang.NullPointerException
at java.util.StringTokenizer.<init>(Unknown Source)
at java.util.StringTokenizer.<init>(Unknown Source)
at Participants.main(Participants.java:22)
因为{/ 1}在
中为空arrays[i]
这是因为你分配了35个条目:
StringTokenizer st = new StringTokenizer(array[i], "!");
并且文件包含的行数少于该值。至少,这就是我用这个输入文件得到的东西:
String array[] = new String[35];
这是可以预期的。
如果我将输入文件的第一行更改为
A!B!C!D
E!F!G!H
I!J!K!L
我得到了
A!B!C
这是因为您只检查一次令牌,但后来继续阅读四:
Exception in thread "main" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(Unknown Source)
at Text2ObjArray.main(Text2ObjArray.java:28)
如果需要,我会用解决方案更新,但这里有两个建议:
1)使用ArrayList
代替 while (st.hasMoreTokens()) {
Person person = new Person(st.nextToken(), st.nextToken(), st.nextToken(), st.nextToken());
:
2)检查你解析的内容:确保每行有4个令牌,并处理它们不是4的例外情况。
<强>更新强>
基本上,您的程序没有任何问题。你已经知道“ 如何将文本文件中的值放入java中的对象数组?“。 如果你的程序只包含35行,每行包含至少3个惊叹号,那么你的程序运行得很好。如果没有,它会抛出相应的例外:
array[]
如果少于35行且NullPointerException
如果还有更多,ArrayIndexOutOfBoundsException
如果任何一行上的感叹号少于3个。(除非NoSuchElementException
类存在问题,如果它是POJO则不太可能。
您的代码只需要进行一些小的更改,以使其适用于包含其他内容的文件。我保持简单:
People
我将import java.io.File;
import java.io.IOException;
import java.util.*;
public class Text2ObjArray {
public static void main(String[] args) {
Person[] participants = loadFile(new File(args.length > 0
? args[0] : "Participants.txt"));
for (Person p : participants)
System.out.println("Participant: " + p);
}
分开作为一种良好做法 - 请参阅'top-down' and 'bottom-up'。
要解决main
和NullPointerException
我们将使用ArrayIndexOutOfBoundsException
代替ArrayList
来跟踪我们从文件中读取的行。 array[]
的优点是它可以增长和缩小,如果您不确定ArrayList
是否总是包含35行,这将非常有用。
此外,它还可以避免我们在阵列充满时用更大的阵列替换它们。这是"Participants.txt"
的便宜,方便的升级,所有改变的都是写作
array.get(i)
代替array[]
array.set(i,foo)
代替array[i]
和array.add(foo)
代替array[i]=foo
和 array[counter++]=foo
而不是array.size()
。它是一个动态数组,因此您可以插入任何位置,删除等。
array.length
此部分的更改只是因为它读取最多 4个令牌,处理private static Person[] loadFile(File file) {
List<String> lines = new ArrayList<>();
try (Scanner scan1 = new Scanner(file)) {
while (scan1.hasNext())
lines.add(scan1.next());
} catch (IOException e) {
System.out.println("File read error: " + e.getMessage());
}
:
NoSuchElementException
要成功运行,您需要将 Person participants[] = new Person[lines.size()];
for (int i = 0; i < lines.size(); i++) {
StringTokenizer st = new StringTokenizer(lines.get(i), "!");
String[] fields = new String[4];
for (int k = 0; k < fields.length && st.hasMoreTokens(); k++)
fields[k] = st.nextToken();
participants[i++] = new Person(fields[0], fields[1], fields[2], fields[3]);
}
return participants;
}
}
替换为Person
或使用此People
类:
Person
我希望这有用。