尝试在读取文件时循环创建对象并出现错误
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 对象而不是列表
我正在为学校创建一个程序,它读取一个文本文件,将数据存储到变量中,然后创建一个对象以将数据传递到其中供以后使用。我现在正在使用扫描仪 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 对象而不是列表