2015-11-09 40 views
1

我有以下代碼,其中的想法是用戶將輸入兩個數字,並將計算兩者的總和。 如果一個無效值,例如字符輸入,錯誤消息應該輸出,但我不斷收到錯誤來自用戶輸入的Java驗證錯誤

的Java

package calculator; 
import java.util.Scanner; 

public class calculator { 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     double n1, n2; 
     String operation; 
     Scanner scannerObject = new Scanner(System.in); 

     System.out.println("Enter first number"); 
     n1 = scannerObject. nextDouble(); 


     System.out.println("Enter second number"); 
     n2 = scannerObject. nextDouble(); 

     Scanner op = new Scanner(System.in); 
     System.out.println("Enter your operation"); 
     operation = op.next(); 

     switch (operation) { 
     case "+": 
      System.out.println("Your answer is " + (n1 + n2)); 
      break; 

     case "-": 
      System.out.println("Your answer is " + (n1 - n2)); 
      break; 

     case "/": 
      System.out.println("Your answer is " + (n1/n2)); 
      break; 

     case "*": 
      System.out.println("Your asnwer is " + (n1 * n2)); 
      break; 

     default: 
      System.out.println("I do not know!");} 
     } 
      int function(){ 
       Scanner input = new Scanner(System.in); 
       System.out.print("Enter an integer between 1-100: "); 
       int range; 
      while(true){ 
        if(input.hasNextInt()){ 
        range = input.nextInt(); 
        if(0<=range && range <= 100) 
         break; 
        else 
         continue; 
        } 
        input.nextLine(); //Comsume the garbage value 
        System.out.println("Enter an integer between 1-100:"); 
       } 
       return range; 
       } 

      } 

,這些都是錯誤的消息,我得到:

錯誤

Exception in thread "main" java.util.InputMismatchException 
    at java.util.Scanner.throwFor(Scanner.java:909) 
    at java.util.Scanner.next(Scanner.java:1530) 
    at java.util.Scanner.nextDouble(Scanner.java:2456) 
    at calculator.calculator.main(calculator.java:14) 

我已經嘗試了很多不同的東西,但無法讓它工作,因爲我wan它。

任何人都可以在這裏得到任何幫助嗎?

感謝您的閱讀

+0

您的輸入是什麼? –

+0

我試着輸入一個字母'p' –

回答

1

這種異常是由Scanner類的實例拋出,指示檢索到的令牌不期望類型匹配的模式,或檢索到的令牌超出範圍。

你可以看到文檔這裏的例外:https://docs.oracle.com/javase/7/docs/api/java/util/InputMismatchException.html

從機制的文檔攝於Scanner

雙nextDouble()

返回下一個標記爲一長。如果下一個標記不是浮點數或者 超出範圍,則會拋出InputMismatchException。

我懷疑你沒有正確輸入你的號碼。確保您的輸入格式正確。

您還應該設置掃描儀的locale一些locales期待一個逗號,,而不是一個點.,如:

Scanner scanner = new Scanner(System.in).useLocale(Locale.US); 
0

您的前兩個輸入應該是數字。如果這是真的,那麼它可能是你的數字的小數點。你需要一個點(.)而不是逗號(,

+0

代碼將不會運行時,我將它更改爲一個點,它表示逗號預計,然後將不會運行 –

+0

不是你的代碼,你的輸入數字應該是一個點 –

0

看來你並沒有輸入任何整數作爲輸入。

您可以通過處理異常這種方式解決這個問題:

try { 
    if(input.hasNextInt()){ 
     range = input.nextInt(); 
     if(0<=range && range <= 100) 
      break; 
     else 
      continue; 
    } 
    input.nextLine(); 
} 
catch (InputMismatchException e) { 
    input.nextLine(); 
} 
+0

我只是嘗試添加此替換我的「while」部分,並引發錯誤InputMismatchException無法解析爲類型 –

0

您的問題是,

scannerObject. nextDouble(); 

你是試圖得到一個雙重的,但輸入一個字符串。您需要執行一些類似下面的輸入驗證,以阻止程序崩潰無效輸入。

try { 
    System.out.println("Enter first number"); 
    n1 = scannerObject. nextDouble(); 
} 
catch(InputMismatchException inEx) { 

    System.out.println("Invalid input"); 
} 

然後,您可能想要創建一個循環來獲取輸入再次agin,直到檢測到有效輸入。

編輯

你需要,

import java.util.InputMismatchException; 

還要創建一個循環來獲得來自用戶的有效輸入。像下面的東西。這只是一個例子,你需要做這樣的事情來處理你的代碼。在實際使用它們的值之前,還需要確保n1和n2已啓動。

boolean notValidInput = true; 

while(notValidInput) { 
    try { 
     System.out.println("Enter first number"); 
     n1 = scannerObject. nextDouble(); 
     notValidInput = false; 
    } 
    catch(InputMismatchException inEx) { 

     System.out.println("Invalid input. Please try again!"); 
    } 
} 
+0

InputMismatchException無法解析爲類型....也說n1沒有初始化 –

+0

看看我上面的編輯 –

+0

好吧,所以我已經編輯它到最近,但我怎麼能初始化n1和n2,因爲這些現在是唯一的兩個錯誤 –