[JAVA] StringTokenizer 여러 번 사용하기(NoSuchElementException 에러)
2024. 2. 27. 09:38ㆍ언어(Language)/JAVA
알고리즘 문제를 풀던 중 StringTokenizer을 여러 번 사용하고 싶었다.
백준 71744787번
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
//N(바구니 개수), M(교환 수) 입력받음
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
//각 바구니에 공 넣기(초기화)
for(int i = 0; i < N; i++) {
arr[i] = (i + 1);
}
//M번 반복하면서 방법 받고, 공 교환
for(int j = 0; j < M; j++) {
//교환 방법 받기
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
//공을 바꾸는 데 임시저장할 공간
int temp = arr[a - 1];
arr[a - 1] = arr[b - 1];
arr[b - 1] = temp;
}
//출력
for(int i = 0; i < N; i++) {
sb.append(arr[i]).append(" ");
}
System.out.println(sb);
}
}
발생한 에러
NoSuchElementException 에러
java.util.NoSuchElementException는 존재하지 않는 것을 가져오려고 할 때 발생하는 에러이다.
따라서 'M번 반복하면서 방법 받고, 공 교환' 반복문 안에서 st를 인식하지 못한 것으로 알 수 있다.
해결방법
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
//N(바구니 개수), M(교환 수) 입력받음
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
//각 바구니에 공 넣기(초기화)
for(int i = 0; i < N; i++) {
arr[i] = (i + 1);
}
//M번 반복하면서 방법 받고, 공 교환
for(int j = 0; j < M; j++) {
st = new StringTokenizer(br.readLine());
//교환 방법 받기
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
//공을 바꾸는 데 임시저장할 공간
int temp = arr[a - 1];
arr[a - 1] = arr[b - 1];
arr[b - 1] = temp;
}
//출력
for(int i = 0; i < N; i++) {
sb.append(arr[i]).append(" ");
}
System.out.println(sb);
}
}
해결방법은 for문 안에 st = new StringTokenizer(br.readLine())을 입력해주면 된다.
추가
나는 for문 안에서 StringTokenizer를 사용하기 위해 새로 불러오는 것이라고 생각하였다.
그래서 st = new StringTokenizer(br.readLine()) 대신에 st1로 바꾸어 보았다.
하지만 오류가 발생하였다.
해결방법1
해결방법2
맨 처음에 했던 것처럼 앞에서 선언했던 st를 사용하면 된다.
'언어(Language) > JAVA' 카테고리의 다른 글
[JAVA] toCharArray() vs charAt() (0) | 2024.04.11 |
---|---|
[JAVA] 백준 2738번 / BufferedWriter Int(정수)형 출력하기 (1) | 2024.03.28 |
[JAVA] StringTokenizer란? (split()과 비교) (0) | 2024.02.21 |
[JAVA] Map & HashMap (1) | 2024.02.20 |
[JAVA] 제네릭(Generic)이란? (0) | 2024.02.20 |