Originariamente inviato da abbobba
Secondo questo è l'unico modo o si può ottimizzare qualcosa?
Innanzitutto se usi nextInt() (o i nextXyz degli altri primitivi es. nextLong ecc...) di Scanner, bisogna sempre prestare attenzione ai token malformati. Se il token non è un valore primitivo in formato corretto es. "12a", i nextXyz lanciano InputMismatchException ma il token rimane nel buffer interno e quindi bisognerebbe toglierlo.
Un esempio di metodo basilare, con un loop per ripetere l'input se malformato, è questo (presuppone un 'scanner' come variabile di istanza):

codice:
public int readIntInput(String prompt) {
    while (true) {
        try {
            System.out.print(prompt);
            return scanner.nextInt();
        } catch (InputMismatchException e) {
            scanner.next();    // butta via il token
        }
    }
}
Oltre a questo, puoi chiaramente "farcire" il metodo come vuoi, es. mettere un messaggio di errore o, come hai appena chiesto, fare una ulteriore validazione sul range del valore, che sarebbe da fare poco prima di far ritornare il valore.

Ma quanto ho mostrato è già abbastanza al minimo (se vuoi fare un loop con gestione dell'input malformato) ... nel senso che meno di questo non avrei idea di come si possa fare.