如何将文本文件中的值放入java中的对象数组?

时间:2015-11-29 21:35:29

标签: java arrays

所以我试图从文本文件创建一个对象数组。我放在数组中的对象是具有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;
            }
        }
    }
}

1 个答案:

答案 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如果还有更多,
  • a 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'

要解决mainNullPointerException我们将使用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

我希望这有用。