Java(jGRASP)骰子游戏InputMismatchException问题求助
Hey there, let's tackle that InputMismatchException you're running into with your dice game in jGRASP! From what you described, the name input works fine, but the dice count method throws errors at dice() and input.nextInt()—this is super common with Java's Scanner class, so let's break down the fixes.
Most Likely Cause: Unhandled Newline in Input Buffer
If you're using input.nextLine() to grab the player's name, here's what happens: when the user types their name and hits Enter, the nextLine() reads the name but leaves the newline character (\n) in the input buffer. Then when you call input.nextInt(), it tries to read that newline as the next input—which isn't an integer, hence the exception.
Fix for Buffer Residue
Clear the buffer after reading the name with an extra input.nextLine():
Scanner input = new Scanner(System.in); // Get player name System.out.print("Enter your name: "); String playerName = input.nextLine(); // Clear the leftover newline from the buffer input.nextLine(); // Now get dice count System.out.print("Enter number of dice per hand: "); int diceCount = input.nextInt();
Note: If you used input.next() for the name (which stops at spaces), you won't have this issue—but next() won't capture names with spaces, so the nextLine() + extra nextLine() trick is better for full names.
Add Input Validation to Prevent Bad Entries
Even if you fix the buffer, users might accidentally type letters or symbols instead of a number. Adding a check will stop the exception before it happens and guide the user to enter valid input.
Here's a robust dice count method with validation:
public static int getValidDiceCount(Scanner input) { int diceCount = 0; boolean isValid = false; while (!isValid) { System.out.print("Enter number of dice per hand (must be a positive integer): "); if (input.hasNextInt()) { diceCount = input.nextInt(); // Make sure the number is actually usable (no zero or negative dice!) if (diceCount > 0) { isValid = true; } else { System.out.println("Oops, you can't have zero or negative dice! Try again."); } } else { System.out.println("That's not a number! Please enter an integer."); // Clear the invalid input from the buffer so we can try again input.next(); } } // Clear the newline left by nextInt() for future input operations input.nextLine(); return diceCount; }
Then call it in your main method like this:
public static void main(String[] args) { Scanner input = new Scanner(System.in); // Get name (using nextLine() for full names) System.out.print("Enter player name: "); String playerName = input.nextLine(); input.nextLine(); // Clear buffer // Get valid dice count int diceCount = getValidDiceCount(input); // Rest of your game logic here... System.out.println("Hey " + playerName + ", we'll use " + diceCount + " dice per hand!"); }
Key Takeaways
- Always clean up the input buffer after mixing
nextLine()withnextInt()/nextDouble()—those methods don't consume the newline character. - Use
hasNextInt()(or similarhasNextX()methods) to validate input before reading it, which prevents InputMismatchException entirely. - Reuse the same
Scannerobject throughout your program instead of creating new ones—multiple Scanners can cause unexpected input behavior.
内容的提问来源于stack exchange,提问作者Jon Akers

