NoSuchElement

java.util.NoSuchElementException는 존재하지 않는 것을 가져오려고 할 때 발생합니다.

Scanner

Scanner에서 이 에러가 발생하는 경우는 더 이상 입력받을 수 있는 값이 없을 때 입니다.

소스 1. 두 수를 입력받고, 합을 출력하는 소스

소스 1이 두 수를 입력받을 수 있다면, 합을 출력하지만, 수가 하나만 입력되는 경우에는 java.util.NoSuchElementException이 발생합니다. 다음은 런타임 에러 메시지입니다.

Exception in thread "main" java.util.NoSuchElementException
	at java.util.Scanner.throwFor(Scanner.java:862)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.nextInt(Scanner.java:2117)
	at java.util.Scanner.nextInt(Scanner.java:2076)
	at Main.main(Main.java:6)

런타임 에러 메시지를 보면 Main.java의 6번 줄에서 입력 받지 못했다는 사실을 알 수 있습니다. 수를 하나만 입력받을 수 있으니, 두 번째 수를 입력받으려고 할 때 에러가 발생합니다.

입력의 끝을 EOF로 판단해야 하는 문제의 경우에 이런 문제가 생길 수 있습니다. 소스 2는 계속해서 입력을 받으면서, 두 수의 합을 출력하는 소스입니다.

소스 2. 두 수를 계속해서 입력받고, 합을 출력하는 소스

보통 이런 문제는 입력의 끝을 EOF로 판단해야 합니다. 더 이상 입력 받을 수가 없는데 입력을 받으려고 했기 때문에, 다음과 같은 입력에서 런타임 에러가 발생합니다.

1 2
3 4
5 6

소스 2에는 더 이상 입력이 없다는 것을 판단할 부분이 필요합니다. Scanner에서는 hasNext, hasNextInt, hasNextLong등과 같은 메소드로 판단할 수 있습니다.

소스 3. hasNextInt를 이용해 입력 받을 수 있는지 검사하면선 두 수의 합을 출력하는 소스

StringTokenizer

StringTokenizer에서 이 에러가 발생하는 경우도 Scanner와 비슷합니다.

소스 4. 한 줄을 입력받고, 처음 6개 정수의 합을 출력하는 소스

소스 4가 6개 이상의 수를 입력받으면, 에러 없이 정상적으로 처음 6개 정수의 합을 출력합니다. 만약, 입력 받은 수가 6개 미만이라면 다음과 같은 런타임 에러가 발생합니다.

Exception in thread "main" java.util.NoSuchElementException
	at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
	at Main.main(Main.java:9)

만약, 6개 미만의 수가 입력된 경우 부족한 수를 0으로 판단하는 경우 hasMoreTokens을 이용해 소스 5와 같이 구현할 수 있습니다.

소스 5. 한 줄을 입력받고, 처음 6개 정수의 합을 출력하는 소스

한 줄을 입력받고, 그 줄에 있는 모든 정수의 합을 출력하는 경우에는 소스 6과 같이 구현할 수 있습니다.

소스 6. 한 줄을 입력받고, 모든 정수의 합을 출력하는 소스