尝试在读取文件时循环创建对象并出现错误

Attempting to create objects in loop while reading files and getting error

我正在为学校创建一个程序,它读取一个文本文件,将数据存储到变量中,然后创建一个对象以将数据传递到其中供以后使用。我现在正在使用扫描仪 class 来读取文件。但是我收到了一个错误。

Exception at java.lang.NullPointerException
at FileRead.readfile(FileRead.java:22)
at FileRead.init(FileRead.java:73)
at FileRead.main(FileRead.java:13)

我不太确定什么是空指针异常,但这是我从 FileRead 中获取的代码:

main 方法并不是那么有趣,但它在这里

public class FileRead {    
    public static void main(String args[]) throws FileNotFoundException {    
    final File folder = new File("/home/work/txt");    

    init(folder);        
}

这是我的 init() 方法

public static void init(final File folder) throws FileNotFoundException {    
    String foo, bar;
    int slime, grit, ball, funk;
    
    for (final File fileEntry: folder.listFiles()) {
        if(fileEntry.isDirectory()) {
            init(fileEntry);    
        } else {
            readfile(fileEntry);
        }    
    }

这里是readfile()

public static void readfile(final File folder) throws FileNotFoundException  {        
    int count = folder.list().length;        
    DT[] dts = new DT[count];    
    File file = folder;    
    String foo, bar;    
    int slime, grit, ball, funk;    
    Scanner input = new Scanner(file);        
    int i = 0;
    
    while (input.hasNextLine()) {        
        foo = input.nextLine();        
        bar = input.nextLine();
        slime = input.nextInt();
        grit = input.nextInt();
        ball = input.nextInt();
        funk = input.nextInt();

        dts[i] = new DT(foo, bar, slime, grit, ball, funk);
        i++;
        break;    
    }            
}

文件reader就这些了,另一个class就简单多了。这里是DT:

私有字符串 foo,栏; 私人 int 粘液、沙砾、球、放克;

public DT(String foo, String bar, int slime, int grit, int ball, int funk) {
    this.foo = foo;
    this.bar = bar;
    this.slime = slime;
    this.grit = grit;
    this.ball = ball;
    this.funk = funk;
    
    ds(foo, bar, slime, grit, ball, funk);
}

public static void ds(String t, String g, int a, int st, int sn, int s) {    
    System.out.println(t + "\n" + g + "\n" + a + "\n" + st + "\n" + sn + "\n" + s);           
}

如果有帮助,我会在 Ubuntu 虚拟机上 运行。非常感谢您对此提供帮助,谢谢!

你的DT class让我想知道,它应该是一个数据class,不是吗? 但是你的数据class没有实例变量,也只提供静态方法来设置内容。关键字 static 将方法指定为 class 方法,这意味着它只能通过 DT.methodName() 而不能通过对象访问,而且它只能编辑静态变量,这意味着你不能使用他们为一个数据class。 NullPointerException 可能出现在这一行: dts[i].set(foo, bar, slime, grit, ball, funk); 即使您在这一行中创建了一个 fixed-sized 数组: DT[] dts = new DT[计数]; 您还必须在每个索引上创建 DT-object。 像这样: dts[i] = 新的 DT(); NullPointerException 告诉你,一个变量没有分配给它任何东西,这意味着 dts[i] 没有指向任何东西(null),这就是为什么你首先必须给它分配一些东西才能使用方法 set() 我会为你的数据推荐这样的东西 class:

public class DT {
    private String foo, bar;
    private int slime, grit, ball, funk;
    public void ds() {
        System.out.println(foo + "\n" + bar + "\n" + slime + "\n" + grit + "\n" + ball + "\n" + funk);
    }
    public DT(String foo, String bar, int slime, int grit, int ball, int funk) {
        this.foo = foo;
        this.bar = bar;
        this.slime = slime;
        this.grit = grit;
        this.ball = ball;
        this.funk = funk;
    }
}

然后像这样创建你的对象: dts[i] = new DT(foo, bar, slime, grit, ball, funk); 最后但同样重要的是,您应该使用更有意义的 class、方法和变量名称,以便其他人知道 class 是什么

错误发生是因为 folder.list() returns null,因为它是一个文件,你之前在 init() 中用 .isDirectory() 测试过这个,而不是用 sub-directorys/files。 为了解决这个问题,你可以只输入一个固定的数字或者根本不使用数组,因为你只有一个元素在里面,因为你在读取一个 DT

后就打破了循环
while (input.hasNextLine()) {        
        foo = input.nextLine();        
        bar = input.nextLine();
        slime = input.nextInt();
        grit = input.nextInt();
        ball = input.nextInt();
        funk = input.nextInt();

        dts[i] = new DT(foo, bar, slime, grit, ball, funk);
        i++;
        break;    // here you close the loop, regardless if input has a next line or not
    } 

但是,如果您在一个文件中有多个 DT,请删除分隔符并改用 ArrayList

更新 - 对于新错误 NoSuchElementException 此异常意味着您正在尝试读取一行,但文件中没有留下任何行。 也许你的文件中没有所有必需的元素,但是,如果你想让你的代码更健壮使用异常处理,在这个例子中你需要这样的东西:

try{
    // your code here (readLine(), etc)
} catch(NoSuchElementException ex){
    // exception handling, like printing that the file doesn't have the correct format
    Syste.out.println("Wrong data format in file "+folder);
}

正如您在我的示例中看到的那样,您的变量名实际上具有误导性,因为“文件夹”实际上是一个文件 另外,正如我已经提到的,如果您的文件包含多个 DT,请删除 while 循环中的中断,或者如果一个文件仅包含一个 DT,请使用简单的 DT 对象而不是列表