无法使循环正常工作

Posted

技术标签:

【中文标题】无法使循环正常工作【英文标题】:Unable to get loop working correctly 【发布时间】:2015-11-06 04:15:08 【问题描述】:

我正在尝试使用输入的特定输入制作一个计算器,例如 + 5 5 或 / 10 2。当我编译并运行它时,我收到此错误:

线程“main”中的异常 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命令运行程序? @Iyen 哈哈,只是输入,完全正确。 :-) 作为猜测,但是您正在运行它的标准输入与您机器的 /dev/null 等价物相关联,因此第一次尝试扫描任何内容都会导致文件结束。 循环应该如何结束,为什么要在循环外定义变量? 为我工作。程序启动,等待输入,我输入+ 5 5<enter>,它打印5.00e+00 + 5.00e+00 = 1.00e+01(奇怪的格式,男人),然后我输入/ 10 2<enter>,它打印1.00e+01 / 2.00e+00 = 5.00e+00,然后我杀死它,因为没有办法结束它一般。那么,是如何运​​行它的呢? 谢谢你让我成功了! 【参考方案1】:

您在scanner 上致电next() 而不与hasNext() 核实

while(input.hasNext())

 num1 = Double.parseDouble(input.nextDouble());
            num2 = Double.parseDouble(input.nextDouble());

......//further code

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

您可以通过在继续您的程序之前先检查用户是否输入了某些内容来避免这种情况。

对于 Scanner 类,这可以使用 hasNext() 方法或它的一些变体来完成。

您可以阅读更多关于它的信息here

举个例子:

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;
        
            

【讨论】:

【参考方案4】:

您收到错误是因为 Scanner 中没有可供函数获取的令牌。您应该使用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));

为此,您需要将 import javax.script.*; 添加到 java 文件的顶部,以及其他导入。

【讨论】:

以上是关于无法使循环正常工作的主要内容,如果未能解决你的问题,请参考以下文章

无法使 PHP 更新功能正常工作

Python:For循环无法正常工作

无法使 @ngrx/store 正常工作

带循环的 Soundpool 无法正常工作

带有“if”的while循环无法正常工作

Swift - 无法使 PickerView 库正常工作