2013-02-27 3 views
5

Java에 익숙하지 않습니다. 다음과 같이 프로그램이 실행 :java.util.NoSuchElementException 해당 요소가 없습니다.

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) 

그것을 실행하려고 코드 아래입니다 :

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

} 

답변

9

사용하지 마십시오 scanner.close() < - 당신의 오류의 소스!

라인을 제거 자바 문서 도구의 scanner.close()newScanner.close()

:

System.in 닫아

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

- 나쁜 선택을!

JDK에서 Scanner.java의 소스 코드에서

, throwFor()은 다음과 같습니다

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

분명히, 우리는 입력의 끝에 도달 한 또는 소스가 닫혀있는 경우, 우리는 NoSuchElementException()을 얻을합니다. 나는 IDEONE에서 하나 때문에이 시도 position == buf.limit() 오히려

+0

이것이 작동하는 것 같지만, 지금은 이클립스가 리소스 누출에 관해 whinging하고 있습니까? – Ravin

+0

+1 설명을 위해 –

+0

@Ravin 코드에서 "resource"누출과 관련하여 잘못된 것이 없습니다. –

1

sourceClosed보다의 일이있다 확신합니다 :

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

는 또한 자바 클래스를 대문자로 써야 할 유의하십시오.

1

나는 Alayed @Aniket이 아주 좋은 대답을했다고 생각합니다. 당신이 import java.util.Scanner; 그래서 불필요한 클래스를 가져하지 않습니다 사용할 수 있습니다 대신 import java.util.*;의 모든

  • 첫째.
  • 두 번째 것은 내가 예와 같이 한 같은 단일 Scanner을 가질 수 있다는 것입니다. (그래서 당신이 그것을 닫을 수 있습니다) 모든

    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

그것도 같은 오류가 발생합니다 : http://ideone.com/cmPucv – CloudyMarble

+0

@MeNoMore 내 컴퓨터에서 작동합니다. 나는'hasNext()'에 대해 +1, 일식 주노, jdk7.0 – Bhushan

1

첫째, 피하기 위해 NoSuchElementException이 당신이 스캐너를 수행해야합니다 .hasNext()는 Scanner.next()를 사용하기 전에 검사합니다. 특히 단일 스캐너 사용에 대한 다른 의견도 유용합니다.

+0

+1을 사용합니다. 'pos == buf.limit()' –

관련 문제