2017-10-04 44 views
-1

我是新來的,所以請原諒我,如果在我的問題上有任何問題,或者它在錯誤的部分。我現在正在練習Java,我想知道如何做到這一點。下面的代碼:如何避免有人在變量上輸入錯誤信息時出錯?

package train; 

import java.util.Scanner; 

public class Train { 

public static double sum(double n1, double n2){ 
    double sum = n1 + n2; 

    return sum; 
} 

public static double subtraction(double n1, double n2){ 
    double subtraction = n1 - n2; 

    return subtraction; 
} 

public static double mult(double n1, double n2){ 
    double mult = n1 * n2; 

    return mult; 
} 

public static double div(double n1, double n2){ 
    double div = n1/n2; 

    return div; 
} 

public static void main(String[] args) { 

    int choice; 
    boolean stay = true; 
    double val1, val2; 
    Scanner sc = new Scanner(System.in); 

    while (stay = true){ 
     System.out.println("Selecione a operação desejada."); 
     System.out.println("1 - Adição, 2 - Subtração, 3 - Multiplicação, 4 - Divisão; Pressione 0 para sair."); 
     choice = sc.nextInt(); 

     switch(choice){ 
      case 1: 
       System.out.println("Digite dois valores a serem somados: "); 
       val1 = sc.nextDouble(); 
       val2 = sc.nextDouble(); 

       double valsum = sum(val1, val2); 

       System.out.printf("A soma desses dois valores é %f. ", valsum); 
      break; 

      case 2: 
       System.out.println("Digite dois valores a serem subtraídos: "); 
       val1 = sc.nextDouble(); 
       val2 = sc.nextDouble(); 

       double valsubtraction = subtraction(val1, val2); 

       System.out.printf("A subtração desses dois valores é %f. ", valsubtraction); 
      break; 

      case 3: 
       System.out.println("Digite dois valores a serem multiplicados: "); 
       val1 = sc.nextDouble(); 
       val2 = sc.nextDouble(); 

       double valmult = mult(val1, val2); 

       System.out.printf("A multiplicação desses dois valores é %f. ", valmult); 
      break; 

      case 4: 
       System.out.println("Digite dois valores a serem divididos: "); 
       val1 = sc.nextDouble(); 
       val2 = sc.nextDouble(); 

       double valdiv = div(val1, val2); 

       System.out.printf("A divisão desses dois valores é %f. ", valdiv); 
      break; 

      case 0: 
       System.exit(0); 
      break; 

      default: 
       System.out.println("Esta não é uma operação válida."); 
      break; 
     } 
    } 
} 

} 

當比任何變量(就像是「雙頭」變量鍵入文本),該程序提供了一個錯誤「接受」信息,其它用戶類型的東西。有可能避免嗎?

如果是這樣,我該怎麼做?

+2

如果您想要更大的靈活性,您可以使用當前的代碼捕獲InputMismatchException,或者將輸入解析爲String並從中解析數據。 – Mena

回答

0

Scanner類很可能在不讀取int時拋出一些異常。作爲開始,你可以

 try{ 
      choice = sc.nextInt(); 
     } 
     catch(InputMismatchException e){ 
      choice=-1; 
      e.printStackTrace(); 
     } 

並嘗試使用調試器來跟蹤程序的執行。

+0

你會想要將異常類型的範圍縮小到「InputMismatchException」,這樣你就不會捕捉你不想要的東西 – jrtapsell

+0

你是對的,我編輯過。 – farbiondriven

0

只是一個簡單的例子。如果用戶輸入了不匹配的輸入類型值。該變量將得到負值。這是-1

Scanner input = new Scanner(System.in); 
    system.out.println("Enter a double number: "); 
    double number; 
    while (number <=0){ 

     try{ 
      number = input.nextDouble(); 
     } 
     catch(InputMismatchException ex){ 
      System.out.println("Please Enter a valid number"); 
     } 
     input.nextLine(); // clears the buffer 


    } 
0

通常應該檢查一個has *方法。奇怪的是,每個人都想抓住例外。

 while (!sc.hasNextDouble()) { 
      System.out.println("Bonvolu tajpi nombron"); 
      sc.next(); // Discard the rubbish. 
     } 
     val1 = sc.nextDouble(); 

     while (!sc.hasNextDouble()) { 
      System.out.println("Bonvolu tajpi nombron"); 
      sc.next(); // Discard the rubbish. 
     } 
     val2 = sc.nextDouble(); 

雖然沒有「掃描下一個雙精度」,但仍然讀取非特定的「下一個」精度值。

可以使用一個函數來防止代碼副本。

private static double scanDouble(Scanner sc, String errorMessage) { 
    while (!sc.hasNextDouble()) { 
     System.out.println(errorMessage); 
     sc.next(); // Discard the rubbish. 
    } 
    return sc.nextDouble(); 
} 
0

爲java.util.Scanner的類的文檔是一個偉大的地方開始的這個問題:

https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

在審查其中的方法,你會發現,掃描儀支持用於測試輸入令牌的數據類型的一系列方法,這些方法是hasNextXXXX()方法(hasNextFloat(),hasNextDouble()等)。使用這些方法,您可以對用戶提供的輸入執行條件檢查,並使用這些檢查來確定是否使用和操作提供的值,或者通知用戶輸入無效。一個簡單的例子:

package inputtest; 

public class InputTest { 

    public static void main(String[] args) { 

     java.util.Scanner scanner = new java.util.Scanner(System.in); 

     System.out.print("Please enter an integer value: "); 

     while(scanner.hasNext()) { 
      if (scanner.hasNextInt()) { 
       int x = scanner.nextInt(); 
       System.out.println("Thanks for the integer; you provided: " + x); 
      } else { 
       System.out.println("Sorry, you did not provide and integer value."); 
       break; 
      } 
     } 

    } 

} 

顯然你可以選擇重新提示輸入,而不是在這裏休息,但方法是相同的。