2017-07-31 69 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; 
    } 
}