평화롭게 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 에러 덕분에 한결 깔끔해진 코드. 굿👩👍
<결론>
코드를 짤 때는 중복되는 코드가 없도록 하자^_^
- 에러가 나를 강하게 만들 것이라고 믿으며, 끝👩💻-
'📚Languages > JAVA 개념·문법·에러' 카테고리의 다른 글
[JAVA 문법] 입력: BufferedReader와 Scanner의 속도 차이😲 (0) | 2020.05.09 |
---|
댓글