3

所以我刚刚开始使用其他几种语言的一点点经验。我试图制作这个基本的计算器,遇到了很多问题,但设法解决了大部分问题。我似乎无法理解的最后一件事是每次我的程序运行一次时随机触发的“这是一个无效的输入”。“...”指的是不相关的代码。其他一切似乎都很好。提前致谢!

import java.util.Scanner;
public class Calc {
...
        System.out.println("Would you like to use the calculator?(Y/N)");
        while(use){
            String usage=in.nextLine().toLowerCase();
            if(usage.equals("n")){use=false;}
        //input
            //operations
            else if(usage.equals("y")){
                ...(calculator code)
            System.out.println("Continue use? (Y/N)");
            }
            else {System.out.println("That is not a valid input");}
        }
    }
}

运行我的代码几次后,我的输出是

Would you like to use the calculator?(Y/N)
Y
Please input an operation: +,-,*,/,%, ^, or root
+
Calculator: Please input your first number.
1
Now enter your second number.
2
Calculating
3.0
Continue use? (Y/N)
That is not a valid input  <-- right there is the confusing part, why is that triggered?
Y
Please input an operation: +,-,*,/,%, ^, or root

如果您需要,完整的代码在 pastebin 上。http://pastebin.com/Qee2Hxe3

4

3 回答 3

6

我检查了完整的代码,在循环第一次重复之前,有一个对 的调用in.nextDouble(),这个方法读取一个 double 但不消耗行尾,这使得下一个立即in.readLine()返回\n并且后续测试失败。

一个简单的解决方案是手动使用 line-end:

System.out.println(ans);
System.out.println("Continue use? (Y/N)");
in.nextLine();
于 2013-06-28T14:03:06.340 回答
3

我测试了您的代码,发现一个解决方案是您的 while 循环中声明您的扫描仪,如下所示:

while (use) {
            Scanner in = new Scanner(System.in);
            String usage = in.nextLine().toLowerCase();

这就是问题所在:首先,您正在进入您的 while 循环,并且用法设置为等于 in.nextLine()。由于没有下一行,它等待您输入一个。你输入是,然后你输入你的公式。然后它返回答案,并返回到 while 循环的顶部。再一次,usage 设置为等于 in.nextLine,但已经有下一行(空白行),因此 usage 设置为等于一个空字符串 (""),它既不是“y”也不是“n”。然后它立即转到最后的“else”选项并打印“invalid”消息。
通过 while 循环的每次迭代重新分配扫描仪可以解决此问题。

于 2013-06-28T14:45:51.907 回答
2

计算时您在代码中读取的最后一个输入是:

  num2=in.nextDouble();

这会读取下一个字符并将其转换为双精度。但是,当您输入您的号码时,您也会按 Enter。这意味着在double 读取之后,输入缓冲区中还剩下一个换行符。

随着代码返回到String usage=in.nextLine().toLowerCase(); ,您现在将阅读此换行符。

你可以忽略空输入,例如做

 String usage=in.nextLine().toLowerCase().trim();
 if (usage.isEmpty()) {
      continue;
  }
于 2013-06-28T14:08:27.047 回答