无法正确运行循环

3

我正在尝试制作一个计算器,其中输入类似于+ 5 5或/ 10 2。当我编译和运行它时,出现以下错误:

异常:java.util.NoSuchElementException
在 java.util.Scanner.throwFor(Scanner.java:907) 中
在 java.util.Scanner.next(Scanner.java:1416) 中
在 calc.main(calc.java:11) 中

我的代码:

import java.util.Scanner;
public class calc {

public static void main(String[] args) {
    Scanner input = new Scanner( System.in );
        String calc;
        double num1;
        double calcdu = 0.0;
        double num2;
        while ( true ) {
            calc = input.next();
            num1 = input.nextDouble();
            num2 = input.nextDouble();

            if (calc.equals("+"))
            { 
                    calcdu= num1 + num2;
                    System.out.printf("%.2e %s %.2e %c %.2e\n", num1, "+", num2, '=', calcdu);
            }       

            if (calc.equals("/"))
            {   
                calcdu=num1/num2;
                System.out.printf("%.2e %s %.2e %c %.2e\n", num1, "/", num2, '=', calcdu);
            }

            if (calc.equals("-"))
            {   
                    calcdu=num1-num2;
                    System.out.printf("%.2e %s %.2e %c %.2e\n", num1, "-", num2, '=', calcdu);
            }       
            if (calc.equals("*"))
            {   
                    calcdu=num1*num2;
                    System.out.printf("%.2e %s %.2e %c %.2e\n", num1, "*", num2, '=', calcdu);
            }
            if (calc.equals("%"))
            {   
                    calcdu=num1%num2;
                    System.out.printf("%.2e %s %.2e %c %.2e\n", num1, "%", num2, '=', calcdu);
            }

}}}

“提交它”是什么意思? 你的意思是使用Java命令运行程序吗? - Brian
@Iyen 哈哈,刚刚输入那个,完全正确。 :-) 猜测一下,不过你运行它的方式可能是将标准输入(stdin)绑定到了你机器上等效于 /dev/null 的位置,所以第一次尝试扫描任何内容都会导致文件末尾(end-of-file)。 - blm
循环应该如何结束,为什么要在循环外定义变量? - Andreas
对我来说可行。程序启动后,等待输入,我键入 + 5 5<enter>,它打印出 5.00e+00 + 5.00e+00 = 1.00e+01(奇怪的格式,伙计),然后我键入 / 10 2<enter>,它打印出 1.00e+01 / 2.00e+00 = 5.00e+00,然后我终止了它,因为没有正常结束它的方法。那么,你是如何运行它的? - Andreas
谢谢,我已经搞定了! - Ryan H
4个回答

1

在没有使用hasNext()检查的情况下,在scanner上调用next()

while(input.hasNext())
{
 num1 = Double.parseDouble(input.nextDouble());
            num2 = Double.parseDouble(input.nextDouble());

......//further code

1

scanner中没有更多的标记时,您尝试获取下一个标记而没有进行检查时,会出现此异常。请参见Java文档中的NoSuchElementException。 在您的情况下,正如Ramanlfc所提到的那样,在没有检查next是否存在的情况下,在扫描仪上调用Next()。您可以使用hasNext()来检查下一个是否存在。


0

当一个类试图获取元素或标记,但没有任何元素或标记时,就会出现NoSuchElementException。例如,如果Scanner类试图从标准输入中获取下一个元素,而那里没有任何东西(为空或为null),这种情况就会发生。这可能是因为用户没有输入任何内容或程序过早终止。

您可以通过首先检查用户是否输入了内容来避免这种情况,然后再继续执行程序。

对于Scanner类,可以使用hasNext()方法或其某个变体来实现此目的。

您可以在这里阅读更多相关信息。

以下是一个示例:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    String operator = "";
    if (input.hasNext()) {  // Check that Scanner has input
        operator = input.next();
    }
    while (true) {
        if (operator.isEmpty()) { // No value entered, program can't continue
            System.out.println("No value entered, program will now exit.");
            break;
        }
    }        
}

0

你之所以会出现错误,是因为扫描器中没有令牌可供函数获取。你应该使用Scanner.hasNext()函数检查扫描器中是否还有令牌。

还有一种更简单的方法可以根据用户输入进行计算,就是使用JavaScript引擎,像这样:

public static void main (String[] args) throws java.lang.Exception
{
    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("JavaScript");

    Scanner kbd = new Scanner(System.in);
    String operator = kbd.next();
    double number1 = kbd.nextDouble();
    double number2 = kbd.nextDouble();

    System.out.println(engine.eval(number1 + operator + number2));
}

为了使其正常工作,您需要在Java文件的顶部添加import javax.script.*;以及其他导入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接