当我运行此代码时,while循环之后的行永远不会执行。我已经在循环内部进行了测试,并且据我所知,循环本身正在完成,该方法永远不会转移到下一行。
我知道有多个类似的主题,但大多数似乎都引用了正确的字符串比较和无限循环。
此示例输入为:
Maria 1 2 3 4
输出应为:
Maria's GPA is 2.50.
任何帮助都将不胜感激。
public static void printGPA(){
Scanner console = new Scanner(System.in);
String studentName = "";
int counter = 0;
int gpa = 0;
System.out.print("Enter a student record: ");
while (console.hasNext()){
if (console.hasNextInt()){
gpa += console.nextInt();
counter += 1;
} else {
studentName = console.next();
}
}
System.out.print(studentName + "'s GPA is ");
System.out.printf("%.2f.", ((double)gpa / (double)counter));
}
答案 0 :(得分:1)
while (console.hasNext()){
是一个等待输入的阻塞调用。如果流未终止,则假定存在更多流。 System.in从键盘读取,该流不应该被关闭,因此“hasNext()”调用将无限期地等待。
修复方法是这样做:
Scanner sc = new Scanner(System.in);
System.out.print("Enter a student record: ");
String str = sc.nextLine();
StringTokenizer st = new StringTokenizer(str);
while (st.hasMoreTokens()) {
String token = st.nextToken();
// try to parse the token as an integer with try-catch Integer.parseInt()
try {
int num = Integer.parseInt(token);
gpa += num;
counter++;
} catch (NumberFormatException e) {
// if it fails, assume it's the name of the student
studentName = token;
}
}
// We only read a single line and we're not asking how much more there is.
答案 1 :(得分:1)
我认为你的问题是你需要另一台扫描仪。第一台扫描仪将抓住输入流中的所有内容。这是一个想法,扫描整行输入并将其扔入字符串。然后用另一台扫描仪扫描该字符串。这是我提出的解决方案:
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
String studentName = "";
int counter = 0;
double gpa = 0;
System.out.print("Enter a student record: ");
String myInput = console.nextLine();
Scanner scan2 = new Scanner(myInput);
while (scan2.hasNext()){
if (scan2.hasNextInt()){
gpa += scan2.nextInt();
counter += 1;
}
else {
studentName = scan2.next();
}
}
System.out.print(studentName + "'s GPA is ");
System.out.printf("%.2f.", (double)(gpa / counter));
}
这应该有效,虽然我需要将gpa的数据类型更改为double以获得正确的计算,但它对我有用。我知道只是重新发布代码似乎没有帮助,但我觉得这更容易向您展示而不是尝试解释它。希望这有助于!!!!
答案 2 :(得分:0)
(除了Xabster的回答) 由于扫描仪流将继续保持直观状态,并且不知道何时停止,因此另一种解决方案是引入退出字,例如"完成"。这意味着它会继续记录,直到你说完了。
public static void printGPA(){
Scanner console = new Scanner(System.in);
String studentName = "";
int counter = 0;
int gpa = 0;
System.out.print("Enter a student record: ");
String input = "";
while (true){
input=console.next();
if (input.equals("done"))
break;
try
{
gpa += Integer.parseInt(input);
counter += 1;
}
catch (NumberFormatException e)
{
studentName = input;
}
}
System.out.print(studentName + "'s GPA is ");
System.out.printf("%.2f.", ((double)gpa / (double)counter));
}
输入:
Maria 1 2 3 4 done
答案 3 :(得分:0)
循环无限并且一直在等待。添加一些会破坏循环的条件 - >
while (console.hasNext()){
if (console.hasNextInt()){
int num = console.nextInt();
if ( num == -99){
break;
}
gpa += num;
counter += 1;
} else {
studentName = console.next();
}
}
然后输入 - > “Maria 1 2 3 4 -99”
或者你可以在计数器达到4之后添加逻辑来打破循环。
while (console.hasNext()) {
if (console.hasNextInt()) {
gpa += console.nextInt();
counter += 1;
if (counter == 4) {
break;
}
} else {
studentName = console.next();
}
}