Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [java] nextint() e nextline()

    Salve
    Ho questo problema
    mettendo in un programma nextint() per ricevere input da tastiera può capitare che anzichè numeri l'utente immette qualche lettera e quindi va in errore.
    su questo problema ho risolto con questo codice :

    catch(InputMismatchException eio)
    {
    System.out.println("ERRORE Puoi inserire solo numeri");
    in.nextLine();
    return false;
    }
    anche se credo che non sia questo il metodo per svuotare ho fatto in.nextLine(); la uso per svuotare i caratteri immessi erroneamente

    ma adesso, poichè ci sono molti input da tastiera mi accorgo che dove nel programma devo inserire stringhe molte volte mi salta l'istruzione.

    Poiche mi accadeva pure in c quando gestivo l'imput da tastiera ho capito che è un problema di buffer, però in java non so gestire
    Agos

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [java] nextint() e nextline()

    Originariamente inviato da agostinomiranda
    mettendo in un programma nextint() per ricevere input da tastiera può capitare che anzichè numeri l'utente immette qualche lettera e quindi va in errore.
    su questo problema ho risolto con questo codice :

    catch(InputMismatchException eio)
    {
    System.out.println("ERRORE Puoi inserire solo numeri");
    in.nextLine();
    return false;
    }
    anche se credo che non sia questo il metodo per svuotare ho fatto in.nextLine(); la uso per svuotare i caratteri immessi erroneamente
    Non l'hai specificato ma chiaramente stai usando la classe Scanner.
    Nel caso di InputMismatchException a dire il vero basterebbe solamente "buttare" via il token con next(), non nextLine().

    Comunque nulla vieta ad esempio di realizzare una classe apposita che si occupa di gestire l'input magari visualizzando un testo di prompt e facendo ripetere l'input se non è corretto.

    Una cosa del tipo:

    codice:
    import java.util.*;
    
    public class Prova
    {
        public static void main (String[] args)
        {
            MyInput myinp = new MyInput ();
            
            int a = myinp.readInt ("Inserisci un intero: ");
        }
    }
    
    
    class MyInput
    {
        private Scanner sc;
    
        public MyInput ()
        {
            sc = new Scanner (System.in);
        }
    
        public int readInt (String prompt)
        {
            do {
                try
                {
                    System.out.print (prompt);
                    return Integer.parseInt (sc.nextLine ());
                }
                catch (NumberFormatException e) { }
            } while (true);
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    La classe e Scanner.
    la tua risposta è giusta, ma rimane il fatto di capire perchè e quale metodo usare per evitare di fare questo(qualche volta):


    String temp = in.nextline();
    String Nome = in.nextline();


    per ricevere solamente la stringa nome, temp invece rimane vuota, saltandola.

    Penso ancora che riceve da altri input il carattere /n e quindi di fine stringa. come mi accadeva in c, dove ero costretto ad usare fflush(stdout)
    Agos

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    La questione fondamentale è che l'input dalla console è "bufferizzato". Cioè il testo digitato sulla console viene fornito alla applicazione solo quando si preme INVIO.

    Prova questo:
    codice:
    public class Prova
    {
        public static void main (String[] args)
            throws IOException
        {
            int b = System.in.read ();
    
            System.out.println ((char) b);
        }
    }
    Lancialo, digita 'a' poi 'b' poi 'c' poi INVIO. Solo quando hai premuto INVIO viene mostrato il primo carattere digitato 'a'.

    Chiaro fin qui?

    Uno Scanner creato passando System.in non riceve l'input finché non si è premuto INVIO (per ciò che abbiamo detto prima). Scanner per default, se non viene impostato altro, usa come delimitatore un "whitespace", cioè spazi, tab, carriage return, line feed, ecc...

    Prova ora questo:
    codice:
    import java.util.*;
    
    public class Prova4
    {
        public static void main (String[] args)
        {
            Scanner sc = new Scanner (System.in);
    
            while (true)
            {
                try
                {
                    int n = sc.nextInt ();
                    System.out.println ("n = " + n);
                }
                catch (InputMismatchException e)
                {
                    System.out.println (e);
                    System.out.println ("token scaricato: " + sc.next ());
                }
            }
        }
    }
    Lancialo e digita i caratteri: ab 12 34 INVIO
    Solo quando hai premuto INVIO allora stampa:

    java.util.InputMismatchException
    token scaricato: ab
    n = 12
    n = 34

    Tra i token c'è appunto un whitespace e questo permette di spezzarli. Il primo token non è un numero, quindi lancia InputMismatchException. Il token però rimane lì. Deve essere il programmatore a leggerlo/saltarlo in altro modo. Un metodo che non ha problemi di formato è next() perché prende un token completo e basta.

    Più chiaro ora?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Forse mi sno spiegato male.

    se inserisco questo in input
    aaaa aa aa 10 aaaaaaaabfds yhghjv vbhj bhb 20 hbh 30

    con il tuo metodo succede che se voglio un int mi da il 10 ma poi se vado a fare una next() mi prende tutto il resto compreso l'invio quindi stringa non valida

    non so se riesco a farmi capire, comunque il problema dell'inserimento di un valore int non mi da più problemi con il mio metodo.

    ma mi capita come nel pezzetto di codice che metto qui sotto che facendo altre operazioni di input anche giuste stringa in una string ed intero in un int quando arriva questo codice la stringa buffer me lo salta quindi vado ad inserire solo la stringa ragionesociale


    Scanner in = new Scanner() //dichiarazione fatta all'inizio

    System.out.printf("Inserisci la ragione sociale : ");
    String buffer = in.next();
    String ragionesociale = in.next();
    Agos

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.