Dubbio classe scanner

di il
6 risposte

Dubbio classe scanner

Ragazzi sto studiando la base del linguaggio java ma ho un dubbio sulla classe scanner.
Una volta inizializzata con ad esempio
Scanner sc = nel Scanner (System.in);
Tutti gli imput posso usare quella?? Tipo negli esercizi a volte mi sembrava si potesse fare alte volte no.
Scusate gli errori grammaticali sto dal cellulare..
Comunque, nel senso che tipo mi serve un input scrivo:
Int n= sc.Nextint();
Ma se poi mi serve un altro input, devo scrivere una nuova scanner iniziale??? O posso tipo scrivere
String a = sc.Nextline();?? Qualcuno che cortesemente mi schiarisca le idee..il libro non lo spiega benissimo

6 Risposte

  • Re: Dubbio classe scanner

    ercucchiaio ha scritto:


    Una volta inizializzata con ad esempio
    Scanner sc = nel Scanner (System.in);
    Tutti gli imput posso usare quella??
    Sì.

    ercucchiaio ha scritto:


    Ma se poi mi serve un altro input, devo scrivere una nuova scanner iniziale???
    No! Di oggetto Scanner collegato allo standard-input (System.in) ne devi avere solo uno.
  • Re: Dubbio classe scanner

    Allora mi spiegate questo codice?? fatto da me per capire tra l'altro..

    --------------------------------------------------------------------------------
    {
    Scanner sc = new Scanner (System.in);
    System.out.println("Inserisci il numero: ");
    if(sc.hasNextInt())
    {
    System.out.println("Bravo ecco il numero!");
    int n = sc.nextInt();
    System.out.println(n);
    System.out.println("Ora inserisci una stringa");
    String m = sc.nextLine();
    System.out.println("Ecco la stringa: "+m);

    }
    else
    {
    System.out.println("Sbagliato...");
    }

    -----------------------------------------------------------------
    inizialmente nell'if chiedo un numero. poi però quando scrive int n = sc.nextInt (), copio il valore del numero sc. all'interno di n, ma se avessi voluto chiedere un nuovo numero come avrei dovuto fare senza inizializzare un'altra scanner?? Stesso dubbio per dopo quando chiedo la stringa..questo è il mio dubbio, io solitamente inizializzo una nuova scanner.. grazie mille per il tempo perso per me
  • Re: Dubbio classe scanner

    ercucchiaio ha scritto:


    Allora mi spiegate questo codice??
    Ti ripeto che per la lettura da standard-input di

    new Scanner(System.in)

    ne devi avere solo uno. Poi che lo assegni ad una variabile locale, ad una variabile di istanza ecc... dipende dal design delle tue classi.

    Una volta che hai l'oggetto Scanner per lo standard-input, su quello invochi quanti nextXXX() ti pare, sono ovviamente tutti input in sequenza. E in generale, devi solo prestare attenzione a inter-mixare l'uso di nextLine() e gli altri nextXXX() che operano su "token".
  • Re: Dubbio classe scanner

    Ho capito e ti ringrazio, ma è proprio per questo che mi chiedo perchè quando faccio partire quel codice, i nuove nextInt che chiedo non me li fa inserire
  • Re: Dubbio classe scanner

    Per farvi capire meglio dove non capisco, guardate questo spezzo di codice:
    ___________________________________________________________________
    System.out.println("Dammi un'inutile stringa");

    ciao = sc.nextLine();

    System.out.println("ATTENZIONE,UN NUMERO: Di quanti anni vuoi calcolare l'interesse annuo??");
    anno = sc.nextInt(); //anni da calcolare

    System.out.println("ATTENZIONE,UN NUMERO: Qual'è il prezzo iniziale??");
    prezzoIniziale = sc.nextInt(); //Prezzo iniziale

    System.out.println("(ATTENZIONE,UN NUMERO: La percentuale annua??");
    interesseAnnuo= sc.nextDouble();
    ______________________________________________________________-
    In questo caso, io metto tutti i dati.
    Se lo scrivo in questo modo invece:
    __________________________________________________________________________


    System.out.println("ATTENZIONE,UN NUMERO: Di quanti anni vuoi calcolare l'interesse annuo??");
    anno = sc.nextInt(); //anni da calcolare

    System.out.println("ATTENZIONE,UN NUMERO: Qual'è il prezzo iniziale??");
    prezzoIniziale = sc.nextInt(); //Prezzo iniziale

    System.out.println("(ATTENZIONE,UN NUMERO: La percentuale annua??");
    interesseAnnuo= sc.nextDouble();

    System.out.println("Dammi un'inutile stringa");

    ciao = sc.nextLine();
    ___________________________________________
    La stringa non me la fa scrivere,perchè???
  • Re: Dubbio classe scanner

    ercucchiaio ha scritto:


    i nuove nextInt che chiedo non me li fa inserire
    Se ad un nextInt() inserisci 123<invio>, ottieni un int 123 ma il/i carattere/i (dipende dalla piattaforma) del "newline" NON viene buttato via, rimane nel buffer interno di Scanner. Ad un prossimo nextInt() il newline verrebbe saltato/scartato, perché per default i whitespace sono delimitatori.

    Ma se invece di un seguente nextInt fai un nextLine, esso consuma fino al newline. E visto che c'era già un newline in sospeso, lo prende subito come una riga vuota ("") e non ti chiede nulla. Questo è così, è by design ... non è un baco o errore. Funziona in questo modo, stop.

    Per questo devi stare attento quando fai dei mix di nextLine e i nextXXX. Se il tuo è un programma abbastanza grande (non un esempietto/esercizietto di poche righe), magari puoi anche pensare di usare sempre e solo nextLine e fare tu le eventuali conversioni necessarie. E magari puoi anche incapsulare tutta la logica di input in una classe a sé stante, offrendo ad esempio metodi es. leggiInt(String prompt) che si fa carico di visualizzare un "prompt" e magari anche di ripete l'input se malformato. Queste decisioni/design spettano a te.
Devi accedere o registrarti per scrivere nel forum
6 risposte