2015-04-02 82 views
0

因此,我一直在關注我正在處理的這種方法。基本上,我需要接受輸入的方法,檢查它是否是一個數字,然後查看它是否在最大值和最小值之間。Java - 連續檢查輸入是否爲雙精度型

我目前遇到的問題是,當我要求用戶輸入一個新的號碼,因爲它們的輸入爲0之前或大於1,000,000。當用戶輸入數字以外的任何東西時,它會崩潰。有任何想法嗎?

如果你決定告訴我怎麼用try/catch語句修復;你能告訴我它是如何工作的嗎?我不是100%確定那些工作如何!

的代碼已經被編輯用最新版本

public static double inRange(Scanner scan, int min, int max) { 
    double Amount = 0.0; 
    boolean isValid = false; 

    while(isValid == false) { 
     if(scan.hasNextDouble()) { 
      Amount = scan.nextDouble(); 
      if(Amount > max) { 
       System.out.print("Error: You cannot enter a number greater than $1,000,000. Try again: "); 
      } 
      else if(Amount < min) { 
       System.out.print("Error: You cannot enter a negative number. Try again: "); 
      } 
      else { 
       isValid = true; 
       break; 
      } 
     } 
     else { 
      System.out.print("Error: You must enter a number! Try again: "); 
      scan.next(); 
     } 
    } 
    return Amount; 
} 
+0

你需要比「它崩潰」更具體。什麼是錯誤? – Blorgbeard 2015-04-02 03:32:04

+0

@Blorgbeard這裏是我輸入的輸入圖片,然後它崩潰了程序。 http://gyazo.com/94e04444c5bb8318022a09fcc199394f – Dom 2015-04-02 04:01:17

回答

0

我認爲錯誤是在這些線路

if(scan.hasNextDouble()) { 
    ... 
} else { 
    System.out.print("Error: You must enter a number! Try again: "); 
    Amount = scan.nextDouble(); // problem is here, remove it! 
} 

如果掃描沒有下雙,怎麼能得到下一個雙重價值?
此外,我認爲這條線

Amount = scan.nextDouble(); 

應該改變這種

scan.next(); 

這是我的代碼,他們很好地工作。

Scanner scan = new Scanner(System.in); 
int min = 0; 
int max = 1000000; 
double Amount = 0.0; 
boolean isValid = false; 

while (isValid == false) { 
    if (scan.hasNextDouble()) { 
     Amount = scan.nextDouble(); 
     if (Amount > max) { 
      System.out.print("Error: You cannot enter a number greater than $1,000,000. Try again: "); 
     } 
     else if (Amount < min) { 
      System.out.print("Error: You cannot enter a negative number. Try again: "); 
     } 
     else { 
      isValid = true; 
       } 
     } 
    else { 
     System.out.print("Error: You must enter a number! Try again: "); 
     scan.next(); 
    } 
} 
+0

我刪除了,並進入無限循環。嘗試修復atm ..循環不斷循環「錯誤:您必須輸入一個數字!再試一次:」 – Dom 2015-04-02 04:06:46

+0

嘗試添加'scan.next();'代替您移除的'nextDouble'。 – Blorgbeard 2015-04-02 04:14:53

+0

@Blorgbeard是對的! Add scan.next();而不是Amount = scan.nextDouble(); – 2015-04-02 04:30:17

0

那麼有幾種方法可以解決這個問題,以及幾種方法來改善您的代碼。

所以問題是,掃描儀返回一個字符串,並要指定該字符串的雙重這是確定,當它是像「23」或「2.4」,但不符合「你好」工作。 你做好檢查如果字符串開頭

if(scan.hasNextDouble()) 

雙,但你不檢查,如果它在其他雙

else { 
     System.out.print("Error: You must enter a number! Try again: "); 
     Amount = scan.nextDouble(); 
    } 

所以如果用戶輸入一個String例如「喂」它說,掃描儀scan沒有double,然後告訴用戶,而是將Amount等於沒有檢查,如果它是一個雙進入接下來的事情。所以如果你再次輸入「Hello」,它會崩潰。但是,如果您像某人建議的那樣刪除該行,則會出現無限循環,因爲如果您看到the documentation對於hasNextDouble,則表示「掃描程序不會超出任何輸入。」這意味着除非您一起移動掃描儀,否則它將繼續檢查您輸入的相同內容。所以,你需要做的是沿着像scan.nextLine()返回剛纔輸入的字符串,你可以用它來給用戶更多的信息像 System.out.print("Error: You must enter a number! " + scan.nextLine() +" is not a number. Try again: ");

所以,如果你輸入「你好」,它會告訴你,移動掃描儀您好不是一個數字。

另外naming convention是變量名稱以小寫字母開頭,因此而不是Amount使用amount。你也可以讓你的代碼更加模塊化,因爲現在儘管min和max是可以改變的變量,但你總是告訴用戶他們是1,000,000和0。所以,如果我把最大值爲2,然後進入3程序會告訴我

「錯誤:你不能輸入數字大於$ 1,000,000個」

如果把上面一行 它將使更多感。

是的,你可以通過使用一個嘗試捕捉趕上InputMismatchException解決原來的問題,但這個答案已經很長,你可以閱讀有關here.

+0

謝謝你的冗長答覆。我很感激。而且,我通常不會用大寫來命名我的變量,但出於某種奇怪的原因,我的手指只是希望它成爲資本。我最終解決了這個問題,它騙了'scan.next();'在該方法被調用的方法中。所以,我刪除了它,它不再要求第二次輸入。 – Dom 2015-04-02 04:41:50

0

我最終解決問題。我有一個'scan.next();'在調用我的inRange()方法的方法中。所以,一旦我刪除了我的問題,它要求輸入兩次解決了,並且該方法成功檢查它是否實際上是一個雙。

public static double deposit(double bankAcc, String pinCode, Scanner scan) { 
    boolean valid = false; 
    double depositAmount = 0; 

    System.out.print("Please enter your PIN #: "); 
    String pinCodeTest = scan.nextLine(); 

    while(valid == false) { 
     if(pinCodeTest.equals(pinCode)) { 
      System.out.print("How much would you like to deposit?: "); 
      depositAmount = inRange(scan, 0, 1000000); 
      valid = true; 
     } 
     else { 
      System.out.println("Error! Incorrect PIN #. Try again: "); 
      pinCodeTest = scan.nextLine(); 
     } 
// I had a 'scan.next();' right here... Thinking it acted as a buffer clear! 
    } 
    return depositAmount; 
} 
    public static double inRange(Scanner scan, int min, int max) { 
    double amount = 0.0; 
    boolean isValid = false; 

    while(isValid == false) { 
     if(scan.hasNextDouble()) { 
      amount = scan.nextDouble(); 
      if(amount > max) { 
       System.out.print("Error: You cannot enter a number greater than $1,000,000. Try again: "); 
      } 
      else if(amount < min) { 
       System.out.print("Error: You cannot enter a negative number. Try again: "); 
      } 
      else { 
       isValid = true; 
       break; 
      } 
     } 
     else { 
      System.out.print("Error: You must enter a number! Try again: "); 
      scan.next(); 
     } 
    } 
    return amount; 
}