2017-07-31 67 views
1

嗨我目前無法在我的猜測遊戲代碼上拋出異常。我想爲字符串輸入(而不是int)輸入一個異常,並且輸入超出限制(50)的數字也是一個例外。謝謝。哪裏可以拋出異常的Java猜測遊戲

public static void main (String[] args) 

{ 
    Random ran = new Random(); 
    int numberToGuess = ran.nextInt(50)+1; 
    int numberOfTries = 0; 
    Scanner input = new Scanner (System.in); 
    int guess; 
    boolean win = false; 

    while (win == false) 
    { 
     System.out.println("Guess a number from 1 to 50!"); 
     guess = input.nextInt(); 
     numberOfTries++; 

     if (guess == numberToGuess) 
     { 
      win = true; 
     } 
     else if (guess < numberToGuess) 
     { 
      System.out.println("Too low. Try again."); 
     } 
     else if (guess > numberToGuess) 
     { 
      System.out.println("Too high. Try again."); 
     } 
    } 

    System.out.println("You got it in " + numberOfTries + " attempt(s)!"); 

} 
+0

什麼是堆棧跟蹤? –

+0

有什麼麻煩? – Compass

+1

@Jason OP沒有得到一個例外,他們問如何拋出一個。 – azurefrog

回答

-1

我真的不認爲你需要拋出異常。您可以使用 Scanner#hasNextInt()驗證輸入是整數。然後將其分配給猜測變量,並檢查它是否大於50。

如果您真的要拋出異常。使用 throw new RuntimeException(message)如果輸入不是整數,或者大於50

編輯: 我不會用它這樣的,但我相信你只是想了解的例外。

System.out.println("Guess a number from 1 to 50!"); 
numberOfTries++; 
if (!input.hasNextInt()) 
    throw new IllegalArgumentException("Input must be a number"); 

guess = input.nextInt(); 
if (guess < 1 || guess > 50) 
    throw new IllegalArgumentException("Input must be a number from 1 to 50"); 
+0

關於我把那些代碼放到什麼地方?抱歉,我是noob在java編程中 – steveee26

+0

不要拋出原始'RuntimeException',使用子類;'IllegalArgumentException'聽起來是正確的 – Andreas

+0

拋出頂級異常不是一個好習慣更具體的異常可以改善文檔並更清楚地向客戶描述爲什麼此外,'RuntimeException'意味着不可恢復的狀態,在原始問題中我看不到任何不可恢復的狀態 –

0

這是一個潛在的解決方案:

import org.apache.commons.lang3.StringUtils; 

import java.util.Random; 
import java.util.Scanner; 

public class StackOverflow45419907 { 
    private final Scanner input; 
    final int numberToGuess; 

    public StackOverflow45419907() { 
    this.input = new Scanner(System.in); 
    numberToGuess = new Random().nextInt(50) + 1; 
    } 

    public static void main(String[] args) { 
    new StackOverflow45419907().playGame(); 
    } 

    private void playGame() { 
    int numberOfTries = 0; 
    int guess = -1; 

    while (guess != numberToGuess) { 
     guess = collectGuess(); 
     numberOfTries++; 

     printClue(guess); 
    } 
    System.out.println("You got it in " + numberOfTries + " attempt(s)!"); 
    } 

    private void printClue(int guess) { 
    if (guess < numberToGuess) { 
     System.out.println("Too low. Try again."); 
    } else if (guess > numberToGuess) { 
     System.out.println("Too high. Try again."); 
    } 
    } 

    private int collectGuess() { 
    System.out.println("Guess a number from 1 to 50!"); 
    final String potentialGuess = input.nextLine(); 
    return validateAndParse(potentialGuess); 
    } 

    private int validateAndParse(String potentialGuess) { 
    if (!StringUtils.isNumeric(potentialGuess)) { 
     throw new IllegalArgumentException("not numeric: " + potentialGuess); 
    } 
    final int asInt = Integer.parseInt(potentialGuess); 
    if (asInt > 50 || asInt < 1) { 
     throw new IllegalArgumentException("value out of valid range: " + asInt); 
    } 
    return asInt; 
    } 
}