[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를 사용하면 된다.