03/07/2014, 16:36xXSkiFire13Xx ha scritto: 03/07/2014, 15:46luc99a ha scritto: L'errore è in quel System.in.read(). Tu hai un carattere lo casti in int e diventa l'ASCII? di quel carattere. Usa la classe Scanner e il metodo nextInt() oppure usa Integer.parseInt() al posto del cast
No aspetta forse non è per quello. Allora Integer.parseInt() non lo puoi usare perchè System.in.read() è uno stream di byte e non una stringa.
System.in.read() legge solo un carattere. Legge la prima volta l'1 che ha codice ASCII 49. Il while ri esegue l'operazione. IO avevo inserito 10 ora legge lo 0 che ha codice ASCII 48, il while ri esegue l'operazione legge il carattere \n che ha ASCII Code 10. 10 è Ottobre e alla fina stampa sempre Ottobre
La soluzione: usare un BufferedReader che converte i bytes in stringhe oppure uno Scanner
?
Ho capito pochissimo di quello che hai scritto xD
Metti conto che ho appena iniziato D:
Lo so che non va bene la pappa pronta, ma non ne so niente xD
Allora:
-non ho capito perché il while riesegue l'operazione. Nel do-while non rieseguiva l'operazione solo se la condizione era vera?
-Cosa è un Bufferedreader e come si usa?
Allora, in pratica quello che succede è questo.
System.in.read() legge un carattere alla volta, mettiamo caso io inserisca 5. Il System.in.read() legge un byte (per 5 leggera 00110101 che in decimale è 53, vedi che sono otto bit quindi un byte e sono il valore ASCII di '5'). La variabile choice avrà quindi valore 53. Ora si arriva al while che avrà una condizione vera in quanto 53 è maggiore di 12. La lista viene quindi ristampata e il System.in.read() legge il carattere \n che tu avevi inserito prima premendo invio. Il valore ASCII di \n (il carattere speciale per le nuove righe) è 00001010 che in decimale è 10. La variabile choice avrà quindi valore 10 adesso. La condizione del while è falsa e si esce dal loop.
Ora 10 è il numero di Ottobre e tutto avviene come se avessi scelto Ottobre. Dato che i valori ASCII dei numeri sono tutti maggiori di 12 verrà sempre letto il carattere \n e choice sarà sempre 10.
Con uno Scanner farei così:
Codice:
Scanner scanner = new Scanner(System.in);
int choice = 0;
try {
choice = Integer.parseInt(scanner.nextLine());
} catch (NumberFormatException e) {
//quello inserito non è un numero
System.out.println("Devi inserire un numero");
System.exit(0);
}
Oppure anche:
Codice:
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
Con un BufferedReader:
Codice:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
choice = Integer.parseInt(reader.readLine());
} catch (NumberFormatException e) {
//quello inserito non è un numero
System.out.println("Devi inserire un numero");
System.exit(0);
}
Se sei interessato negli ASCII Codes ho fatto questo:
http://l99creations.altervista.org/progr.../ascii.php . Non è totalmente Spam visto che centra con la discussione
(Modificato 03/07/2014, 20:36 da luc99a.)