[Problema] La mia "prima" classe in java

  • Pagine (2):
  • 1
  • 2
  • »
Oggi ho provato ad unire le conoscenze che ho acquisito su java con un metodo che ho visto nel libro su java che ho che dovevo ancora provare.

Ho provato a creare un "menù" con la lista dei mesi e scrivendo il numero di un mese dovrebbe venire scritto <mese> si trova in <stagione>.

Qui si trova il Source: Source

Eclipse non mi da alcun genere di errori.


Ah, dimenticavo l'errore xD
Qualunque numero metto, mi ripete due volte la lista e poi mi dice Ottobre si trova in Autunno D: (Modificato 03/07/2014, 15:08 da SkiFire13.)
My Config:
    MotherBoard: GigaByte 990 FX A-UD3 Ultra Durable
    CPU: AMD FX-8350 (8 core, 4.00GHz)
    Dissipatore: ThermalRight Macho HR-02 Rev.a
    RAM: Corsair Vengeance 8GB 4GBx2
    GPU: nVidia GTX 780 Asus OC
    PSU: Corsair CX 750M
    Case: Cooler Master 690 III Midi
    SSD 256GB
    HHD 1TB
    Masterizzatore
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 (Modificato 03/07/2014, 16:02 da luc99a.)
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?
My Config:
    MotherBoard: GigaByte 990 FX A-UD3 Ultra Durable
    CPU: AMD FX-8350 (8 core, 4.00GHz)
    Dissipatore: ThermalRight Macho HR-02 Rev.a
    RAM: Corsair Vengeance 8GB 4GBx2
    GPU: nVidia GTX 780 Asus OC
    PSU: Corsair CX 750M
    Case: Cooler Master 690 III Midi
    SSD 256GB
    HHD 1TB
    Masterizzatore
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.)
2 utenti apprezzano questo post
Ok Smile

Quindi se a me serve che choice sia un numero (int) cosa mi consigli?

Ah, un'altra cosa, ho un dubbio che non centra nulla con la discussione:
Nei casi (case) di switch il "valore" può anche essere diverso da un numero, potrebbe essere una "parola"? Ovvio che switch dovrà controllare i casi relativi ad una String.
My Config:
    MotherBoard: GigaByte 990 FX A-UD3 Ultra Durable
    CPU: AMD FX-8350 (8 core, 4.00GHz)
    Dissipatore: ThermalRight Macho HR-02 Rev.a
    RAM: Corsair Vengeance 8GB 4GBx2
    GPU: nVidia GTX 780 Asus OC
    PSU: Corsair CX 750M
    Case: Cooler Master 690 III Midi
    SSD 256GB
    HHD 1TB
    Masterizzatore
03/07/2014, 20:30xXSkiFire13Xx ha scritto: Ok Smile

Quindi se a me serve che choice sia un numero (int) cosa mi consigli?

Ah, un'altra cosa, ho un dubbio che non centra nulla con la discussione:
Nei casi (case) di switch il "valore" può anche essere diverso da un numero, potrebbe essere una "parola"? Ovvio che switch dovrà controllare i casi relativi ad una String.

Allora in tutti e tre alla fine la variabile è un int quindi è indifferente.

Puoi usare lo switch sulle stringhe solo dal JDK 7 mi sembra

luc99a (Modificato 03/07/2014, 20:50 da luc99a.)
03/07/2014, 20:35luc99a ha scritto:
03/07/2014, 20:30xXSkiFire13Xx ha scritto: Ok Smile

Quindi se a me serve che choice sia un numero (int) cosa mi consigli?

Ah, un'altra cosa, ho un dubbio che non centra nulla con la discussione:
Nei casi (case) di switch il "valore" può anche essere diverso da un numero, potrebbe essere una "parola"? Ovvio che switch dovrà controllare i casi relativi ad una String.

Allora in tutti e tre alla fine la variabile è un int quindi è indifferente.

Poi usare lo switch sulle stringhe solo dal JDK 7 mi sembra

luc99a

Buon a sapersi Smile

Ok, e per le altre cose? Switch accetta tutti i tipi di variabili?
My Config:
    MotherBoard: GigaByte 990 FX A-UD3 Ultra Durable
    CPU: AMD FX-8350 (8 core, 4.00GHz)
    Dissipatore: ThermalRight Macho HR-02 Rev.a
    RAM: Corsair Vengeance 8GB 4GBx2
    GPU: nVidia GTX 780 Asus OC
    PSU: Corsair CX 750M
    Case: Cooler Master 690 III Midi
    SSD 256GB
    HHD 1TB
    Masterizzatore
03/07/2014, 20:49xXSkiFire13Xx ha scritto:
03/07/2014, 20:35luc99a ha scritto:
03/07/2014, 20:30xXSkiFire13Xx ha scritto: Ok Smile

Quindi se a me serve che choice sia un numero (int) cosa mi consigli?

Ah, un'altra cosa, ho un dubbio che non centra nulla con la discussione:
Nei casi (case) di switch il "valore" può anche essere diverso da un numero, potrebbe essere una "parola"? Ovvio che switch dovrà controllare i casi relativi ad una String.

Allora in tutti e tre alla fine la variabile è un int quindi è indifferente.

Poi usare lo switch sulle stringhe solo dal JDK 7 mi sembra

luc99a

Buon a sapersi Smile

Ok, e per le altre cose? Switch accetta tutti i tipi di variabili?

Per le stringhe appunto solo dopo un certo JDK (credo il 7). Oltre a quello accetta i tipi int, byte, short e char. Inoltre accetta anche gli enum

luc99a
@luc99a ho un'altro problema, dovrei mettere la scelta del mese all'interno di do-while, ma dopo (fuori dal blocco) devi utilizzare choice per verificare a cosa corrisponda nei due switch ed essendo all'interno di un blocco gli switch non lo vedono.

Ho provato a risolvere dichiarando choice prima, e pare funzionare.

Però non riconosce Scanner come un type D:

ps. sto usando il secondo codice

edit: dovevo importare java.util.scanner, ora funziona tutto Big Grin (Modificato 03/07/2014, 21:43 da SkiFire13.)
My Config:
    MotherBoard: GigaByte 990 FX A-UD3 Ultra Durable
    CPU: AMD FX-8350 (8 core, 4.00GHz)
    Dissipatore: ThermalRight Macho HR-02 Rev.a
    RAM: Corsair Vengeance 8GB 4GBx2
    GPU: nVidia GTX 780 Asus OC
    PSU: Corsair CX 750M
    Case: Cooler Master 690 III Midi
    SSD 256GB
    HHD 1TB
    Masterizzatore
1 utente apprezza questo post
03/07/2014, 21:41xXSkiFire13Xx ha scritto: @luc99a ho un'altro problema, dovrei mettere la scelta del mese all'interno di do-while, ma dopo (fuori dal blocco) devi utilizzare choice per verificare a cosa corrisponda nei due switch ed essendo all'interno di un blocco gli switch non lo vedono.

Ho provato a risolvere dichiarando choice prima, e pare funzionare.

Però non riconosce Scanner come un type D:

ps. sto usando il secondo codice

edit: dovevo importare java.util.scanner, ora funziona tutto Big Grin

Si hai fatto bene a dichiararla fuori dal do-while e a importare Scanner, quello non lo avevo scritto scusa

luc99a
  • Pagine (2):
  • 1
  • 2
  • »
Discussioni simili
 
[Problema] Aiuto con Java
1 106
Risposta di simone36050
11/04/2018, 23:15
Risposta di ChildNeverDies
08/04/2018, 18:18
Risposta di TheAdryano99
30/03/2018, 10:06
Risposta di alex3025
13/01/2018, 11:51
Risposta di Andrylly03
26/12/2017, 22:30

Utente(i) che stanno guardando questa discussione: 1 Ospite(i)