Java 为什么我的学生字符串没有打印出来?
我有三个小java类,我试图从文件中读入一些数据并打印出来。这是我的代码,它们很短 Student.javaJava 为什么我的学生字符串没有打印出来?,java,Java,我有三个小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){
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;
}
这就是Students.txt的样子:
Name0
22
1.2
Name1
22
2.71
Name2
19
3.51
我期待着看到这一点:
名称0 22 1.2
姓名1222.71
姓名2193.51
但是我没有得到任何输出。我不知道发生了什么事。找不到文件吗?我来自python,它看起来像是一个try:。。。除了:pass
之类的东西,抛出IOException
之类的东西
我正在使用Eclipse,在src文件夹、bin文件夹和工作区顶部都有Students.txt,因为我不知道它需要放在哪里
编辑:
在改变while循环的条件并添加了一堆打印语句之后,我让它读入了一个学生。现在的输出是:
名称0
22
1.2
1.
跳环
名称0 22 1.20
我不明白为什么它在1次循环后停止。以下情况:
x.hasNextLine() &&x.hasNextInt() && x.hasNextDouble() && count < MAX
x.hasNextLine()&&x.hasNextInt()&&x.hasNextDouble()&&count
将始终计算为
false
。x
如何同时拥有nextInt
和Double
?考虑一下输入文件的格式。也许你可以让它用制表符分隔(或任何其他分隔符),假设一行一个学生?在这种情况下,如果x.hasNextLine满足以下条件,则在中仅使用一个条件来实现读取方法要容易得多:
x.hasNextLine() &&x.hasNextInt() && x.hasNextDouble() && count < MAX
while (x.hasNextLine() &&x.hasNextInt() && x.hasNextDouble() && count < MAX)
x.hasNextLine()&&x.hasNextInt()&&x.hasNextDouble()&&count
将始终计算为false
。x
如何同时拥有nextInt
和Double
?考虑一下输入文件的格式。也许你可以让它用制表符分隔(或任何其他分隔符),假设一行一个学生?在这种情况下,如果x.hasNextLine()和x.hasNextInt()和x.hasNextDouble()和&x.hasNextDouble()和&count中只使用一个条件实现读取方法要容易得多
while (x.hasNextLine() &&x.hasNextInt() && x.hasNextDouble() && count < MAX)
想想这个条件
hasNextInt()
和hasNextDouble()
是互斥的,因此它总是返回false
从概念上讲,理解x.hasNexInt()
并不意味着“x
在某处有另一个int”,它意味着x
中的下一个元素是int
另外,不相关但:一般来说,当您发现自己有这样一个条件语句(根据经验法则,有多个&&
)时,您应该问问自己是否真的可以通过将其分解为多个语句来简化该条件语句
EDIT:(响应您的更新)尝试在不使用if(“.equals(name))
子句的情况下运行它。我并不清楚为什么它会在预期的时间之前被触发,但您的输出表明它是这样的,而且在任何情况下,这个子句似乎都是多余的:顶部的hasNextLine()
conditional已经提供了一种在数据集末尾退出循环的机制。有些情况下,像这样的二次检查是必要的,但问问自己,你是否在其中 while(x.hasNextLine()&&x.hasNextInt()&&x.hasNextDouble()&&count
想想这个条件
hasNextInt()
和hasNextDouble()
是互斥的,因此它总是返回false
从概念上讲,理解x.hasNexInt()
并不意味着“x
在某处有另一个int”,它意味着x
中的下一个元素是int
另外,不相关但:一般来说,当您发现自己有这样一个条件语句(根据经验法则,有多个&&
)时,您应该问问自己是否真的可以通过将其分解为多个语句来简化该条件语句
EDIT:(响应您的更新)尝试在不使用
if(“.equals(name))
子句的情况下运行它。我并不清楚为什么它会在预期的时间之前被触发,但您的输出表明它是这样的,而且在任何情况下,这个子句似乎都是多余的:顶部的hasNextLine()
conditional已经提供了一种在数据集末尾退出循环的机制。有些情况下,像这样的二次检查是必要的,但问问自己,你是否在其中 你调试代码了吗?我是说,你有没有试着打印出一些关于读取文件的数据?就像每个循环一样,打印一条“循环”消息或其他东西。@newboyhun好主意!:3将更新我的question@Broseph回复:你的更新,见我的更新答案你调试代码了吗?我是说,你有没有试着打印出一些关于读取文件的数据?就像每个循环一样,打印一条“循环”消息或其他东西。@newboyhun好主意!:3将更新我的question@Broseph回复:您的更新,请参阅我的更新答案NextTint和nextFloat不使用后面的换行符。在nextFloat之后调用nextLine会得到空字符串。nextInt和nextFloat不会使用后面的换行符。在nextFloat之后调用nextLine得到了空字符串。