2013-02-27 17 views
5

Nowość w Javie - po prostu próbuję ją opanować. Program jest wykonywany w następujący sposób:java.util.NoSuchElementException Brak wyjątku takiego elementu

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) 

Kodeks stara się uruchomić jest poniżej:

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; 
    } 

} 

Odpowiedz

9

Nie używaj scanner.close() < - źródłem swój błąd!

demontażu linii scanner.close() i newScanner.close()

Od DOC Java:

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

Co oznacza, że ​​zamyka System.in - zły wybór!

z kodu źródłowego Scanner.java w JDK, throwFor() jest:

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

Oczywiście, jeśli doszliśmy do końca wejścia, albo jeśli źródłem jest zamknięta, wtedy otrzymujemy NoSuchElementException(). Jestem całkiem pewien, że jeden na IDEONE działo się z powodu position == buf.limit() zamiast sourceClosed

+0

Wydaje się, że to działa, ale teraz zaćmienie mówi o wycieku zasobów? – Ravin

+0

+1 dla wyjaśnienia –

+0

@Ravin Nie widzę niczego złego w wycieku "zasobów" w twoim kodzie. –

1

Spróbuj tego:

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; 
    } 
} 

pamiętać również, że klasy java powinny być kapitalizowane.

1

Myślę, że alercja @Aniket dała bardzo dobrą odpowiedź.

  • Przede wszystkim zamiast import java.util.*; można użyć import java.util.Scanner; więc nie będzie importować niepotrzebnych klas.
  • Drugą rzeczą jest to, że można mieć jedno Scanner jak mam pokazane w przykładzie. (Dzięki czemu można go zamknąć)

    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

Podaje ten sam błąd: http://ideone.com/cmPucv – CloudyMarble

+0

@MeNoWięcej działa na moim komputerze, używam eclipse juno, jdk7.0 – Bhushan

1

Przede wszystkim, aby uniknąć NoSuchElementException należy wykonać Scanner .hasNext() sprawdź przed użyciem Scanner.next(). Użyteczne są także inne komentarze, szczególnie dotyczące korzystania z pojedynczego skanera.

+0

+1 dla 'hasNext()' - unika się przypadku 'pos == buf.limit()' –

Powiązane problemy