2015-11-06 294 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文件的頂部,以及其他進口。