Problemi con la classe Scanner

di Anonimizzato12508 il
11 risposte
Premetto che non so se è il modo migliore per prendere un input da tastiera, la prima volta che ho usato il metodo nextline ha funzionato, più avanti nel programma però:
Scanner inputCarattere=new Scanner(System.in);
		String tmp="";
		tmp=inputCarattere.nextLine();
		this.carattereInserito=tmp.charAt(0);
		inputCarattere.close();
quando lo eseguo mi da un errore Eccezione e dice che non trova testo nella linea successiva, ovviamente, se aspettasse che inserisco il carattere la troverebbe come faccio a risolvere il problema?

11 Risposte

  • Ciao, potresti postare l'eccezione che ti viene lanciata?
  • Certo, appena arrivo a casa le posto
  • Ecco l'errore:
    Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:907)
    at java.util.Scanner.next(Scanner.java:1416)
    at com.lanzarinirudy.CaratteriSegreti.leggiCarattere(CaratteriSegreti.java:14)
    at com.lanzarinirudy.Impiccato.main(Impiccato.java:16)
  • Per caso prima della nextLine fai una nextInt? Perché in questo caso ci sono problemi dovuti alla bufferizzazione dell'input..
  • Nell'errore che ho postato era un input.next(), ma era solo una prova, inizialmente era un nextline().
    comunque non ho mai invocato nextInt() però nel codice precedente ho usato un altro nextline() chiamato però da un'altra classe può essere quello il problema? come svuoto il buffer?
  • Dunque se l'eccezione ti si presenta puntualmente la seconda volta che esegui quel codice allora il problema è dovuto al fatto che ti fai una close solo scanner, la quale si ripercuote anche su "system.in", ovvero la console.. Quindi, di fatto, ti chiudi la console (che non può essere riaperta). La soluzione potrebbe consistere nell'utilizzo di un solo scanner e di chiuderlo solo alla fine
  • In effetti se tolgo input.close() l'eccezione non c'è più, però il compilatore mi dà un warning di memory leak.
    Dovrei, come dici tu, creare un solo oggetto Scanner, ma i 2 printline() sono scritti all'interno di 2 classi diverse, quindi se creo l'oggetto scanner in una classe non lo vede più nell'altra... come posso fare?
  • Secondo me potresti condividere lo stesso scanner, ad esempio creando un'ulteriore classe che ha il compito di effettuare letture da tastiera. Qualcosa del tipo:
    
    public class Lettore {
       private Scanner s;
       private Lettore instance;
    
       private Lettore(){
          s = new Scanner(System.in);
       }
    
       public static Lettore getInstance(){
          if (instance == null){
             instance = new Lettore();
          }
          return instance;
       }
    
       public void close(){
          s.close();
       }
    
       public String nextLine(){
          return s.nextLine();
       }
    }
    
  • Adesso funziona, grazie, però non capisco a cosa servirebbe getInstance()?
  • È l'applicazione del pattern singleton
  • Interessante.. sembra molto utile, grazie
Devi accedere o registrarti per scrivere nel forum
11 risposte