Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    23

    Quesito da niubbo

    Ciao a tutti ragazzi!
    Mi sono da pochissimo avventurato nel mondo Java (qualche settimana) e sto facendo i miei primissimi passi.
    Ho cercato di buttare giù un semplicissimo programma per imparare a destreggiami tra classi/oggetti/metodi ecc... ma mi trovo subito di fronte ad un piccolo problema.
    Pensando fosse un errore di programmazione ho riassunto tutto il programma in queste 3 righe, ma il problema si presenta lo stesso.
    Come mai il programma non attende l'immissione del nome studente e salta direttamente alla matricola? Il resto funziona....

    Inserisci il numero di studenti che vuoi caricare
    1
    Inserisci il nome dello studente
    Inserisci il numero di matricola studente
    12
    Inserisci la materia da caricare
    Matematica
    Inserisci il voto da caricare
    16
    Inserimento Terminato
    Numero studenti caricati: 1
    Nome:
    Matricola: 12
    Materia: Matematica
    Voto: 16


    vi riporto il codice:

    codice:
    import java.util.Scanner;
    
    
    public class Totale {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		Scanner in = new Scanner (System.in);
    		System.out.println("Inserisci il numero di studenti che vuoi caricare");
    		int numeroStudenti = in.nextInt();
    		System.out.println("Inserisci il nome dello studente");
    		String nome = in.nextLine();
    		System.out.println("Inserisci il numero di matricola studente");
    		String matricola = in.nextLine();
    		System.out.println("Inserisci la materia da caricare");
    		String materia = in.nextLine();
    		System.out.println("Inserisci il voto da caricare");
    		int voto = in.nextInt();
    		if (voto<16) {
    			System.out.println("sei stato bocciato in "+ materia);	
    		}
    		System.out.println("Inserimento Terminato");
    		System.out.println("Numero studenti caricati: "+numeroStudenti);
    		System.out.println("Nome: " + nome);
    		System.out.println("Matricola: " + matricola);
    		System.out.println("Materia: "+materia);
    		System.out.println("Voto: "+voto);
    	}
    
    }
    Grazie a tutti!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326

    Moderazione

    Alcune regolette da seguire all'apertura di una nuova discussione (elencate anche nel Regolamento interno):

    1) Il titolo della discussione deve dare un'idea del contenuto della discussione, non dello status dell'autore.

    2) Il codice va postato indentato all'interno degli appositi tag CODE, in modo da mantenerne formattazione e indentazione:

    [CODE]
    codice indentato
    [/CODE]

    Sistemo io la tua discussione, in futuro pensaci tu.

    In merito al problema, è dovuto all'uso di nextInt() . Il metodo nextInt() prende l'input dell'utente (che è composto da ciò che l'utente ha digitato compreso l'INVIO), e cerca di parserizzare un numero intero. La parserizzazione si ferma prima del carattere di INVIO, che rimane nel buffer di input. L'invio rimasto nel buffer verrà preso come risposta (come se l'utente avesse digitato solo INVIO) della nextLine() successiva.

    La nextLine(), infatti, prende tutto l'input fino all'INVIO e consuma l'INVIO stesso. La nextInt() no, non consuma l'invio alla fine riga.

    Soluzione, dopo aver eseguito la nextInt() esegui immediatamente una nextLine() per pulire il buffer.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    23
    Ciao!
    intanto mi scuso per non aver seguito le regole del forum, in futuro starò più attento

    Ahn.. ecco perchè non andava! Ti ringrazio della spiegazione, provo a smanettarci un pò

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Se vuoi un consiglio, non utilizzare i metodi di parserizzazione di Scanner quando devi leggere dell'input da utente. L'input da utente è il meno sicuro in assoluto (ovvero, è il tipo di input dal quale è sempre bene diffidare). Quando si deve leggere dell'input da utente, quindi, conviene non fidarsi mai delle informazioni in ingresso, trattarle sempre come stringhe ed effettuare la parserizzazione in sede separata, in modo controllato onde evitare spiacevoli conseguenze.

    Se tu usi nextInt(), l'applicazione si aspetta di leggere un valore intero. Ma che succede se l'utente digita una porcheria sulla tastiera (cosa che accade circa l'85% delle volte)? In questo caso, la classe Scanner solleva un'eccezione ed il programma termina miserabilmente.

    In questi casi conviene effettuare una lettura controllata dell'input, affidandosi ad un metodo apposito:

    1) usare sempre nextLine() (che non genererà mai eccezioni se non per colpa del programma stesso): in questo modo l'intero buffer viene pulito.

    2) Tentare di parserizzare la stringa all'interno di un blocco try/catch in modo da evitare che vengano sollevate eccezioni in modo non controllato: si ha il pieno controllo della situazione e si può intervenire (ad esempio, richiedendo nuovamente l'input all'utente) per correggere eventuali errori.

    3) Restituire il valore corretto alla fine della richiesta.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    23
    Ti ringrazio del consiglio, è stato molto utile

    Credo tornerò presto a chiedere altri consigli perchè sono proprio alle prime armi

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.