[Problema] La mia "prima" classe in java

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, 14: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, 15:02 da luc99a.)
03/07/2014, 14: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, 15:36xXSkiFire13Xx ha scritto:
03/07/2014, 14: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, 19: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, 19: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, 19:50 da luc99a.)
03/07/2014, 19:35luc99a ha scritto:
03/07/2014, 19: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, 19:49xXSkiFire13Xx ha scritto:
03/07/2014, 19:35luc99a ha scritto:
03/07/2014, 19: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, 20: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, 20: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
Ah @xXSkiFire13Xx ho dimenticato una cosa, dopo che hai letto la variabile e le hai assegnato un valore è bene chiudere lo Scanner. Inoltre forse è meglio creare un unico Scanner quindi metti la linea
Scanner scanner = new Scanner(System.in);
Fuori dal do-while

La linea
int choice = scanner.nextInt();
Lasciala dove è

E fuori dal do-while aggiungi
scanner.close();

Capita di dimenticarsi di chiudere le risorse, però bisognerebbe chiuderle sempre

luc99a
Ma non basta usare:

public static Scanner;

input = new Scanner;

System.out.print();
Mese = input.nextLine;

Ecc.?
Ciao,
             SPAstef


08/07/2014, 22:24SPAstef ha scritto: Ma non basta usare:

public static Scanner input;



input = new Scanner();

System.out.print();
String mese = input.nextLine();

Ecc.?

Con nextLine() ottieni una stringa, ma li serviva un int.
Si si poteva dichiarare scanner come static all'estero del main(), ma essendo la "prima" classe forse è più semplice dichiararlo come variabile locale a main() (secondo me ha più senso dichiararlo locale al main() dato che viene usato solo li)

Ho corretto le parentesi mancanti e il nome che mancava nella dichiarazione di input

luc99a
Discussioni simili
Risposta di Kahune
23/08/2018, 17:58
Risposta di Maxetto
19/05/2018, 17:29
Risposta di Maxetto
10/05/2018, 09:45
 
[Problema] Aiuto con Java
1 231
Risposta di simone36050
11/04/2018, 22:15
Risposta di ChildNeverDies
08/04/2018, 17:18

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