我有三个小的java类,我试图从文件中读取一些数据并将其打印出来。这是我的代码,它们很短。
Student.java
package students;
import java.text.*;
public class Student{
private String name;
private int age;
private double gpa;
public Student(String name, int age, double gpa){
this.name = name;
this.age = age;
this.gpa = gpa;
}
public String toString(){
String gpa_string = new DecimalFormat("#.##").format(gpa);
return name + " " + Integer.toString(age) + " " + gpa_string + "\n";
}
}
Students.java
package students;
import java.util.*;
import java.io.*;
public class Students {
public static final int MAX = 100;
private Student students[];
private int count;
public void readFile(String path) throws IOException{
students = new Student[MAX];
Scanner x = new Scanner(new File(path));
count = 0;
while (x.hasNextLine() && count < MAX){
String name = x.nextLine();
if("".equals(name)){
System.out.println("Breaking out of loop");
break;
}
System.out.println(name);
int age = x.nextInt();
System.out.println(age);
double gpa = x.nextDouble();
System.out.println(gpa);
students[count] = new Student(name, age, gpa);
count += 1;
System.out.println(count)
}
x.close();
}
public String toString(){
String result = "";
for(int i = 0; i < count; ++i)
result += students[i].toString();
return result;
}
Driver.java
package students;
import java.io.*;
public class Driver {
public static void main(String[] args) throws IOException{
Students students = new Students();
students.readFile("Students.txt");
System.out.print(students.toString());
}
}
这就是Students.txt的样子:
Name0
22
1.2
Name1
22
2.71
Name2
19
3.51
我期待看到这个: 名称0 22 1.2 名称1 22 2.71 姓名2 19 3.51
但我完全没有输出。我不确定发生了什么。是否找不到文件?我来自python,似乎try: ... except: pass
类似事情正在进行throws IOException
的事情。
我正在使用Eclipse,我在src文件夹,bin文件夹和工作区顶部都有Students.txt,因为我不知道它需要去哪里。
修改
在更改了while循环的条件并添加了一堆打印语句之后,我让它读取了一个学生。现在的输出是: NAME0 22 1.2 1 打破循环 姓名0 22 1.20
我不明白为什么它会在1循环后停止。
答案 0 :(得分:4)
以下条件:
x.hasNextLine() &&x.hasNextInt() && x.hasNextDouble() && count < MAX
将始终评估为false
。 x
如何同时拥有下一个Int
和Double
?想想输入文件的格式。也许你可以使用制表符分隔(或任何其他分隔符),假设一行 - 一个学生?在这种情况下,if x.hasNextLine
答案 1 :(得分:2)
while (x.hasNextLine() &&x.hasNextInt() && x.hasNextDouble() && count < MAX)
想想这个有条件的......
hasNextInt( )
和hasNextDouble( )
是互斥的,所以它总是会返回false。
从概念上讲,理解x.hasNexInt()
并不意味着“x
在某个地方有另一个int”,这意味着x
中的 next 元素是一个int 。
另外,不相关但是:一般来说,当你发现自己有这样的条件语句时(根据经验有多个&&
),你应该问自己是否真的可以简化条件把它分成多个陈述。
编辑: (响应您的更新)尝试在没有if("".equals(name))
子句的情况下运行它。我没有立即明白为什么它会在预期之前被触发,但是你的输出表明它是,并且无论如何这个子句似乎是多余的:顶部的hasNextLine( )
条件已经提供了退出循环的机制在数据集的末尾。有些情况下需要进行这样的二次检查,但要问问自己是否在一个。