Ti fai un wrapper che espone dei metodi ad hoc, tipo readInteger, readDouble, readBoolean, ecc... a seconda del tipo di input che ti aspetti.
Chiedi allo scanner il prossimo token (la riga digitata dall'utente e acquisita da System.in) e utilizzi i metodi statici delle classi wrapper dei tipi primitivi per il parsing (ad esempio Integer.parseInt): se il parsing va male viene lanciata un'eccezione, nel qual caso devi ripetere la richiesta di inserimento di input all'utente e acquisire un nouvo token dallo scanner per il parsing... ergo serve un ciclo.
Ad esempio:
Codice:
public class CheckedConsole {
private final Scanner scanner;
public CheckedConsole() {
scanner = new Scanner(System.in);
scanner.useDelimiter("\n");
}
public int readNextInteger(String message) {
while (true) {
try {
System.out.println(message);
String line = scanner.next();
return Integer.parseInt(line.trim());
} catch (NumberFormatException ignored) {
// do nothing, continue the loop
}
}
}
public int[] readIntegerArray(final int count) {
int[] results = new int[count];
for (int i=0; i<count; i++) {
String msg = String.format("Please, enter an integer (%d of %d):", (i+1), count);
results[i] = readNextInteger(msg);
}
return results;
}
/**
* Test the class
*/
public static void main(String[] args) {
CheckedConsole console = new CheckedConsole();
int[] numbers = console.readIntegerArray(5);
for (int number : numbers) System.out.print(number + " ");
}
}
In esecuzione succede questo:
Quote:
run:
Please, enter an integer (1 of 5):
12
Please, enter an integer (2 of 5):
qwerty
Please, enter an integer (2 of 5):
a bc 23
Please, enter an integer (2 of 5):
a 23
Please, enter an integer (2 of 5):
23
Please, enter an integer (3 of 5):
345678
Please, enter an integer (4 of 5):
hello!
Please, enter an integer (4 of 5):
1
Please, enter an integer (5 of 5):
q
Please, enter an integer (5 of 5):
5
12 23 345678 1 5
|