Problema con scanner tastiera

di il
7 risposte

Problema con scanner tastiera

Buongiorno.
oggi ho installato l'IDE java (apache netbeans) e JDK11.
Non riesco a capire l'entità del problema, ma in un programma da me scritto non funziona la classe Scanner.
Eseguo il programma, mi stampa la prima riga di testo, e nel momento in cui dovrei inserire i dati, il programma non rileva ciò che digito sulla tastiera.
Cosa ho sbagliato?
fatemi sapere, grazie

import java.util.Scanner;
public class cioccolatini
{
    public static void main(String[] args)
    {
        int NumeroCioccolatiniScatola, CioccolatiniMangiati, CioccolatiniRimasti;
        
        Scanner tastiera = new Scanner(System.in);
        
        System.out.println("Quanti cioccolatini ci sono nella scatola?");
        NumeroCioccolatiniScatola = tastiera.nextInt();
        System.out.println("Quanti cioccolatini hai mangiato?");
        CioccolatiniMangiati = tastiera.nextInt();
        
        CioccolatiniRimasti = NumeroCioccolatiniScatola - CioccolatiniMangiati;
        
        System.out.println("ti sono rimasti" +CioccolatiniRimasti +"cioccolatini");
    }
}

7 Risposte

  • Re: Problema con scanner tastiera

    newbie93 ha scritto:


    Eseguo il programma, mi stampa la prima riga di testo, e nel momento in cui dovrei inserire i dati, il programma non rileva ciò che digito sulla tastiera.
    Dove lo stai provando? Intendo: su una "vera" console del sistema o nella "console" di NetBeans? E se quest'ultima, cosa succede di strano?
  • Re: Problema con scanner tastiera

    Se per caso lo stai provando da una pagina su internet con un compilatore online, allora devi inserire i tuoi dati nel tab STDIN, ad esempio

    15
    11

    e puoi compilare ed eseguire.
  • Re: Problema con scanner tastiera

    E, comunque, dopo aver letto l'input con nextInt() devi consumare il newline che ancora rimane nel buffer nello Scanner.

    Quindi, dopo ogni "tastiera.nextInt()" devi aggiungere una lettura "a vuoto":
    
    NumeroCioccolatiniScatola = tastiera.nextInt();
    tastiera.nextLine();   // Pulisce il buffer dal newLine
    ...
    
    PS: per convenzione, le variabili dovrebbero iniziare con la lettera minuscola e procedere in camelCase.
  • Re: Problema con scanner tastiera

    andbin ha scritto:


    newbie93 ha scritto:


    Eseguo il programma, mi stampa la prima riga di testo, e nel momento in cui dovrei inserire i dati, il programma non rileva ciò che digito sulla tastiera.
    Dove lo stai provando? Intendo: su una "vera" console del sistema o nella "console" di NetBeans? E se quest'ultima, cosa succede di strano?
    lo ho provato su netbeans. non mi da nessun tipo di "errore", ma non mi è possibile inserire le variabili da tastiera. ho installato Eclipse e ho fatto partire lo stesso codice. lì è andato.
    immagino quindi sia un problema di netbeans. vorrei risolverlo in quanto la dispensa che sto seguendo utilizza netbeans, e mi piacerebbe seguire alla lettera le spiegazioni visto che sono ancora agli inizi
  • Re: Problema con scanner tastiera

    LeleFT ha scritto:


    E, comunque, dopo aver letto l'input con nextInt() devi consumare il newline che ancora rimane nel buffer nello Scanner.

    Quindi, dopo ogni "tastiera.nextInt()" devi aggiungere una lettura "a vuoto":
    mi potresti spiegare meglio a cosa serve questo procedimento, per favore?

    LeleFT ha scritto:


    PS: per convenzione, le variabili dovrebbero iniziare con la lettera minuscola e procedere in camelCase.
    sarà fatto, ci farò più attenzione dal prossimo codice che scrivo, grazie
  • Re: Problema con scanner tastiera

    newbie93 ha scritto:


    lo ho provato su netbeans. non mi da nessun tipo di "errore", ma non mi è possibile inserire le variabili da tastiera.
    In NetBeans, per inserire l'input da tastiera devi semplicemente scrivere nella stessa tab dove vedi l'output. E' esattamente come se fosse un "prompt dei comandi".



    newbie93 ha scritto:


    mi potresti spiegare meglio a cosa serve questo procedimento, per favore?
    Quando tu inserisci l'input da tastiera, scrivi qualcosa e poi premi INVIO per confermare. Se usi uno dei metodi tipo nextInt() / nextLong() ecc. lo Scanner legge tutto quello che hai scritto fino al primo "separatore" escluso (i separatori, se non diversamente specificato, per Scanner sono spazi, tabulazioni, fine riga, ecc compreso l'INVIO). Questo significa che lui legge dal buffer tutto quello che hai scritto fino all'INVIO, che è un separatore... ma questo separatore non viene "consumato" dalla lettura e rimane nel buffer. Alla prossima lettura, quindi, verrà preso quel che c'è ancora nel buffer (l'INVIO) e cercherà di assegnarlo alla variabile. A te sembrerà che il programma abbia saltato una lettura, mentre invece ha semplicemente consumato l'INVIO che è rimasto del buffer.
    Per questo, dopo aver letto da tastiera usando uno dei metodi specifici per numeri e altri tipi primitivi, è necessario "pulire" il buffer dall'INVIO rimasto appeso.

    La cosa si risolve, volendo, leggendo sempre a linee intere ( nextLine() ) e facendo il parsing a mano del valore. nextLine(), infatti, legge un'intera riga consumando il separatore di fine riga (l'INVIO).

    Ciao.
  • Re: Problema con scanner tastiera

    Giusto solo per chiarire in generale. Il problema del newline che causa un input "vuoto" senza chiedere nulla c'è solo quando si fa uno dei nextXXX() (es. nextInt/nextLong/...) e POI subito dopo un nextLine(). Altrimenti il problema NON esiste.
Devi accedere o registrarti per scrivere nel forum
7 risposte