2013-02-27 17 views
5

Nuovo in Java - solo cercando di ottenere un handle su di esso. Il programma è in esecuzione come segue:java.util.NoSuchElementException Nessuna eccezione di elementi di questo tipo

What's your age?23 
23 
What's your name?Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Unknown Source) 
    at java.util.Scanner.next(Unknown Source) 
    at king.getName(king.java:25) 
    at king.main(king.java:9) 

Il codice che sta cercando di eseguire è qui sotto:

import java.util.*; 

public class king { 



    public static void main(String[] args){ 
     System.out.println(getAge()); 
     System.out.println(getName()); 
    } 

    public static int getAge(){ 
     System.out.print("What's your age?"); 
     Scanner scanner = new Scanner(System.in); 
     String age = scanner.next(); 
     scanner.close(); 
     int numberAge = Integer.parseInt(age); 
     return numberAge; 

    } 

    public static String getName(){ 
     System.out.print("What's your name?"); 
     Scanner newScanner = new Scanner(System.in); 
     String name = newScanner.next(); 
     newScanner.close(); 
     return name; 
    } 

} 

risposta

9

Non utilizzare scanner.close() < - fonte del vostro errore!

rimuovere le linee scanner.close() e newScanner.close()

Da DOC Java:

When a Scanner is closed, it will close its input source if the source implements the Closeable interface.

Il che significa che chiude la System.in - cattiva scelta!

Da codice sorgente di Scanner.java in JDK, throwFor() è:

private void throwFor() { 
    skipped = false; 
    if ((sourceClosed) && (position == buf.limit())) 
     throw new NoSuchElementException(); 
    else 
     throw new InputMismatchException(); 
} 

Chiaramente, se si è raggiunta la fine dell'input, o se la sorgente è chiuso, allora otteniamo la NoSuchElementException(). Sono abbastanza sicuro che quello di IDEONE è accaduto a causa di position == buf.limit() piuttosto che sourceClosed

+0

Sembra funzionare, ma ora eclissi si lamenta della perdita di risorse? – Ravin

+0

+1 per spiegazione –

+0

@Ravin Non vedo nulla di sbagliato con "risorsa" perdita nel codice. –

1

Prova questo:

public class King { 
    public static void main(final String[] args) { 
    final Scanner scanner = new Scanner(System.in); 
    System.out.println(getAge(scanner)); 
    System.out.println(getName(scanner)); 
    } 

    public static int getAge(final Scanner scanner) { 
    System.out.print("What's your age?"); 
    final String age = scanner.next(); 
    final int numberAge = Integer.parseInt(age); 
    return numberAge; 
    } 

    public static String getName(final Scanner scanner) { 
    System.out.print("What's your name?"); 
    final String name = scanner.next(); 
    return name; 
    } 
} 

Si noti inoltre che le classi Java devono essere capitalizzati.

1

Penso che alraedy @Aniket abbia dato un'ottima risposta.

  • Prima di tutto, invece di import java.util.*; è possibile utilizzare import java.util.Scanner; in modo da non importare le classi non necessarie.
  • seconda cosa è che si può avere un singolo Scanner come ho mostrato nell'esempio. (In modo da poter chiudere)

    import java.util.Scanner; 
    public class SO6 { 
        static Scanner scanner = new Scanner(System.in); 
        public static void main(String[] args){ 
         System.out.println(getAge()); 
         System.out.println(getName()); 
         scanner.close(); 
        } 
    
        public static int getAge(){ 
         System.out.print("What's your age?"); 
         String age = scanner.next(); 
         int numberAge = Integer.parseInt(age); 
         return numberAge; 
    
        } 
    
        public static String getName(){ 
         System.out.print("What's your name?"); 
         String name = scanner.next(); 
         return name; 
        } 
    } 
    
+0

Ha lo stesso errore: http://ideone.com/cmPucv – CloudyMarble

+0

@MeNoMore funziona sulla mia macchina, sto usando eclipse juno, jdk7.0 – Bhushan

1

Prima di tutto, per evitare NoSuchElementException è necessario eseguire Scanner .hasNext() controllare prima di utilizzare Scanner.next(). Sono anche utili altri commenti, in particolare sull'utilizzo di uno scanner singolo.

+0

+1 per 'hasNext()' - evita il caso di 'pos == buf.limit()' –

Problemi correlati