当我突破内心时,为什么我的信息打印两次?

时间:2015-07-01 19:30:57

标签: java

我的代码有点问题。然而,当我试图突破内循环时,编译和运行效果很好,

System.out.println("Type which category you want to add to.");
System.out.println("Homework, Classwork, Labs, Test, Quizzes, Midterm, Final");

当我只想打印一次时,上面的代码会打印两次到终端。

我感觉这是一个简单的错误,我的方括号对齐方式,但我很难弄清楚如何做到这一点。任何帮助将不胜感激!

import java.util.Scanner;

public class GetGrade {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        final int MAX = 15;

        int[] homework = new int[MAX];
        int[] classwork = new int[MAX];
        int[] lab = new int[MAX];
        int[] test = new int[MAX];
        int[] quizzes = new int[MAX];
        int[] midterm = new int[MAX];
        int[] fin = new int[MAX];
        int hwCount, clCount, labCount, testCount, quizCount, midCount, finCount;
        double hwTotal, clTotal, labTotal, testTotal, quizTotal, midTotal, finTotal;
        double grade = 0;

        String selection = "";

        System.out.println();
        System.out.println("Welcome to GetGrade!");
        System.out.println();

        while (true) {

            System.out.println("Type which category you want to add to.");
            System.out.println("Homework, Classwork, Labs, Test, Quizzes, Midterm, Final");
            selection = input.nextLine();

            if (selection.equals("homework")) {

                System.out.print("What percentange of your grade is homework? > ");
                double hwPercent = input.nextDouble();
                System.out.println("Now begin typing your grades. When you are finished, type -1.");

                for (int i = 0; i < homework.length; i++) {
                    homework[i] = input.nextInt();
                    hwTotal = homework[i] * hwPercent;
                    grade += hwTotal;
                    if (homework[i] == -1) break;
                }
            }
        }
    }
}

5 个答案:

答案 0 :(得分:1)

它看起来同样微不足道:
对input.nextInt()的调用;在你的内部循环中不包括换行符。 所以你打破了内部循环,接收下一行只包含换行符 - input.nextLine()中的字符;这是&#34; -1 \ n&#34;的剩余输入。行并再次进行主循环,因为它不匹配&#34;作业&#34;。

答案 1 :(得分:0)

尝试将while循环中的条件变量设置为实际的布尔值而不是true。

此外,当你调用&#34; break&#34;时,你只是打破了for循环。如果此时将布尔变量重新指定为false,则可以完全退出while循环。

答案 2 :(得分:0)

在循环结束之前,添加一个&#34;你想继续吗? (Y / N)&#34;功能。

如果用户输入&#34; N&#34;或其他任何事情,执行另一个休息。而那个突破将让你摆脱while循环。

答案 3 :(得分:0)

让代码正常工作的简单方法是更改​​

selection = input.nextLine();

selection = input.next();

next()只读取字符串值(这是您在代码中实际执行的操作),而不是Peter建议的newline字符。

因此,当您阅读newline字符时,不会发生额外的迭代迭代。

答案 4 :(得分:0)

当您使用扫描仪从键盘读取一行时,它会读取所有内容,包括用户键入的换行符以提交输入。例如:

Type which category you want to add to.
Homework, Classwork, Labs, Test, Quizzes, Midterm, Final
>

如果您输入&#34;家庭作业&#34;然后输入,实际输入成为&#34;作业\ n&#34;。 input.nextLine()将扫描输入,直到遇到第一个换行符,&#39; \ n&#39;它将消耗,然后返回到该点的所有内容(即&#34;作业&#34; )。

你的问题是input.nextInt()不使用换行符,因此当你的while循环开始另一轮时,输入缓冲区中仍然会有换行符。

Now begin typing your grades. When you are finished, type -1.
> ...
> -1
      => User input is "-1\n"
-------------------------------

// Meanwhile, back in the code...
for (int i=0;i<homework.length;i++) {
   homework[i] = input.nextInt();      // <--- This call consumes "-1" but leaves '\n'
   hwTotal = homework[i] * hwPercent;
   grade += hwTotal;
   if (homework[i] == -1) break; 
}

下一次调用input.nextLine()时会消耗该换行符,导致输入缓冲区为空。

while (true) {
    System.out.println("Type which category you want to add to.");
    System.out.println("Homework, Classwork, Labs, Test, Quizzes, Midterm, Final");
    selection = input.nextLine();    // <--- This call consumes the leftover '\n' and returns the empty string
    ...

因为&#34;&#34;不等于&#34; homework&#34;,while循环再循环一次,但这次输入缓冲区为空,因此对input.nextLine()的调用就像你期望的那样

// selection is empty, so this condition fails and the program loops back around
if (selection.equals("homework")) {
    ...

这个问题有两个简单的解决方案。你可以

  • 使用Integer.parseInt(input.nextLine())代替input.nextInt()
  • input.nextLine()循环结束时添加对while的额外调用以使用最终换行符

第一个选项可能是最强大的,如果它们没有给你一个有效的整数作为输入,你会得到运行时错误的附加好处。