2015-11-06 302 views
3

我试图与某一输入一个计算器,输入如+ 5或/ 10 2.当我编译并运行它,我得到这个错误:无法获得循环正常工作

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1416)
at 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); 
      } 

}}} 
+0

“提交”是什么意思? 你的意思是你使用java命令运行程序? – Brian

+0

@Iyen哈哈,只要输入那个,*完全*。 :-)作为一个猜测,不管你运行的是它的stdin绑定到你的机器的等同于/ dev/null的,所以第一次扫描任何东西都会导致文件结束。 – blm

+0

循环如何结束,为什么变量定义在循环之外? – Andreas

回答

1

你呼吁scannernext()而不hasNext()

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类试图从标准输入中获取下一个元素,并且没有任何内容(空或空)。如果用户没有输入任何内容或程序过早终止,就会发生这种情况。

通过首先检查用户在继续使用程序之前输入的内容,可以避免这种情况。

对于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; 
     } 
    }   
} 
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)); 
} 

对于这个工作,你将需要添加import javax.script.*;到你的java文件的顶部,以及其他进口。