본문 바로가기
📚Languages/JAVA 개념·문법·에러

[JAVA 에러] StringTokenizer와 nextToken() 사용 중 발생한 NoSuchElementException

by psS2mj 2020. 5. 15.
반응형

주석처리한 부분은 나중에 수정한 것이다.

평화롭게 BOJ 사이트에서 문제를 풀고 있었다.

그러던 중 인접리스트의 원소들을 채우는 과정에서 부득이하게 V2 = Integer.parseInt(st.nextToken()); 라는 코드를 두 번 작성했다. 위에서 한 번 받은 후에 그걸 사용하고, 밑에서 다시 받아서 for문이 다시 시작되면 바로 사용하려고 했던건데 오류가 났다. 그리고 그 오류의 내용은 NoSuchElementException였다. (직역하면 그런 원소 없다?!🤔)

 

구글링을 해본 결과 하나의 값에 대해서 next가 두 번 나오게 되면 발생하는 오류라는 정보를 얻었다.

 

나는 StringTokenizer로 입력받은 문자열을 토큰으로 자르고, nextToken()를 이용해서 V2 = Integer.parseInt(st.nextToken()); 이런 식으로 다음 토큰을 받는 과정에서 오류가 났던 거라 이 부분을 아래처럼 하나로 줄였다.

지금 다시 보니 왜 저렇게 짰을까? 싶은데 생각대로 코드를 작성하다보니... 그럴 수도 있지^_^ 덕분에 새로운 에러 하나 알았으니까 하하하하🤗👍

 

다행히 잘 돌아간다 (그리고 정답!ㅎㅎ)

문제의 35번째 줄을 고치니 잘 돌아갔다.

두 번 작성했던 V2 = Integer.parseInt(st.nextToken()); 라는 코드를 하나로 줄여서 그런 듯하다.

 

에러를 잡긴 했는데, 곰곰이 생각해보니 위에서 V2에 값이 들어가고 중간에 써먹고 다시 V2에 값을 받으려고 하는데 왜 안되지? 싶었다. 그래서 다시 살펴본 수정 전 코드.

// 수정 전 코드
for (int j = 1; j < num; j++) {
	adj.get(V1).add(V2 = Integer.parseInt(st.nextToken()));
	indegree[V2]++;
	V1 = V2;
	V2 = Integer.parseInt(st.nextToken());
}

 

에러 내용을 보면 단순히 V2 = Integer.parseInt(st.nextToken()); 라는 코드가 두 번 들어가서 그런게 아니라 맨 아래에서 V2에 값을 받고 맨 위로 올라가서 다시 바로 값을 받아서 그런 듯했다. 왜냐하면 에러는 35번째 줄에서 났으니까! (38번째 줄이 아니라!!)

 

(사실 혼자 실험을 좀 해봤는데 하나의 변수를 재활용하는건 상관 없지만 사용하지 않고 값을 바로 받는 것이 문제인 듯.. 나중에 조금 더 정확히 공부해보자)


그리고 수정 후 코드.

for (int j = 1; j < num; j++) {
	V2 = Integer.parseInt(st.nextToken());
	adj.get(V1).add(V2);
	indegree[V2]++;
	V1 = V2;
}

 

코린이 인생에 처음 만난 NoSuchElementException 에러 덕분에 한결 깔끔해진 코드. 굿👩👍

 

<결론>

코드를 짤 때는 중복되는 코드가 없도록 하자^_^

 

 

- 에러가 나를 강하게 만들 것이라고 믿으며, 끝👩‍💻-

반응형

댓글