Java方法不会继续循环

时间:2014-08-18 19:17:39

标签: java while-loop java.util.scanner

当我运行此代码时,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));      
}

4 个答案:

答案 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();
        }
    }