자바 stringtokenizer해결책 구해요

StringTokenizer st; for (int k = 0; k < sentence.length; k++) { System.out.print(sentence[k]); st = new StringTokenizer(sentence[k], " ");

        for (int i = 0; i < cnt_line; i++) {
            op[i] = st.nextToken();
            for (int j = 0; j < 2; j++) {
                n[i][j] = Integer.parseInt(st.nextToken());
                if (j == 1)
                    System.out.println(": " + Calc(n[i][0], n[i][1], op[i]));
            }
        }
    }

stringtokenizer에 반복문으로 sentence 배열에 있는 문장들을 다시 대입시키고있는데 k가 0일때 이후로는 에러가 아래와 같이 뜹니다.

Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(StringTokenizer.java:349) at prac.practice.main(practice.java:47)

센텐스를 가르키고있는 포인터가 다시 맨앞으로 가지 않는것인가요? 해결책을 구합니다.

3답변

  • 코드 전체가 있는게 아니라서 작성자분의 의도를 파악하긴 어렵지만 nextToken에서 에러가 나는 것이라면 hasMoreTokens()을 이용하시는 게 좋을 듯 싶습니다.

    StringTokenizer st; for (int k = 0; k < sentence.length; k++) { System.out.print(sentence[k]); st = new StringTokenizer(sentence[k], " ");

    여기에서는 k가 갈 때마다 st를 덮어쓰는 형식이 될텐데 이렇게 짜신 의도를 모르겠습니다.

    • 전체코드는 아래와 같습니다. 이민주 2018.12.3 15:38
  • package prac;

    import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.util.ArrayList; import java.util.Collections; import java.util.StringTokenizer;

    public class practice { static FileReader reader;

    public static void main(String args[]) throws Exception {
        try {
            reader = new FileReader("input.txt");
        } catch (FileNotFoundException e) {
            System.out.println("파일을 열 수 없습니다.");
            System.exit(1);
        }
        BufferedReader rd = new BufferedReader(reader);
        int cnt_line = 0;// 파일의 행 수
        String line = null;// 파일로 부터 읽어들인 조각들을 저장하는것
        while ((line = rd.readLine()) != null) {// 한줄씩 읽는다
            cnt_line++;
        }
        rd.close();
    
        String sentence[] = new String[cnt_line];// 라인들을 연결해서 하나의 문장으로 만드는것
        reader = new FileReader("input.txt");
        BufferedReader rd2 = new BufferedReader(reader);
        int a = 0;
        while ((line = rd2.readLine()) != null) {// 한줄씩 읽는다
            System.out.println(line);
            sentence[a++] = line;
        }
        rd2.close();
    
        String op[] = new String[cnt_line];// 연산자를 행별로 담음
        int n[][] = new int[cnt_line][2];
    
        StringTokenizer st;
        for (int k = 0; k < sentence.length; k++) {
            System.out.print(sentence[k]);
            st = new StringTokenizer(sentence[k], " ");
    
            for (int i = 0; i < cnt_line; i++) {
                op[i] = st.nextToken();
                for (int j = 0; j < 2; j++) {
                    n[i][j] = Integer.parseInt(st.nextToken());
                    if (j == 1)
                        System.out.println(": " + Calc(n[i][0], n[i][1], op[i]));
                }
            }
        }
    }
    
    static int Calc(int a, int b, String op) {
        int result = 0;
        switch (op) {
        case "ADD":
            result = a + b;
            break;
        case "SUB":
            result = a - b;
            break;
        case "MUL":
            result = a * b;
            break;
        case "DIV":
            result = a / b;
            break;
        default:
            result = 923;
            break;
        }
    
        return result;
    }
    

    }

  • input.txt 에 무슨 정보가 들어 갔는 지는 모르겠지만, sentence[k] 를 인자로 스트링 토크나이저를 만드 셨는데 int i = 0; i < cnt_line; i++ 를 for문의 조건으로 해 버리시면 input.txt의 모든 줄이 스트링토큰나이저를 했을 때 토큰의 개수가 input 줄의 개수랑 똑같아야 하는 좀 이상한 코드가 됩니다. for 문 대신에 while문을 사용하여 hasMoreToken()을 사용하는 것이 더 적당해 보입니다.

    • 그 부분에 대해서는 while ((line = rd.readLine()) != null) {// 한줄씩 읽는다 cnt_line++; } 이민주 2018.12.3 16:50
    • 이 부분으로 해결해서 자동으로 똑같아지게 됩니다. 문제인 부분은 op[i] = st.nextToken() 이부분 같습니다. 이민주 2018.12.3 16:50
    • 아 제 말은 op[i] = st.nextToken() 라는 코드가 for문 안에 있잖아요?? 그렇기 때문에 토큰의 개수가 input의 줄의 개수 이상은 항상 있어야 하는 코드라는 말이였습니다. JakeOne IM 2018.12.3 16:52

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.