java计算器随机输出行

时间:2013-06-28 13:54:20

标签: java

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

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

3 个答案:

答案 0 :(得分:6)

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

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

System.out.println(ans);
System.out.println("Continue use? (Y/N)");
in.nextLine();

答案 1 :(得分:3)

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

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

以下是问题所在:首先,您进入while循环,并将使用率设置为等于in.nextLine()。由于没有下一行,它等待您输入一行。输入yes,然后输入公式。然后它返回答案,然后返回到while循环的顶部。再一次,用法被设置为等于in.nextLine,但是已经存在下一行(空白行),因此使用设置为等于空字符串(“”),它既不是“y”,也不是“n”。然后它立即进入末尾的“else”选项并打印“无效”消息 通过while循环的每次迭代重新分配扫描程序可以解决此问题。

答案 2 :(得分:2)

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

  num2=in.nextDouble();

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

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

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

 String usage=in.nextLine().toLowerCase().trim();
 if (usage.isEmpty()) {
      continue;
  }