计算lexemes - 字符串越界异常

时间:2011-04-18 02:22:54

标签: java

我有一个小程序,可以计算lexemes。我得到的是一个erorr。我对Java很新。这是错误:

c:\programming>java LexemesTokenizer
input string: a = ++b; c = d - /* -e */ --f;
Input string= a
Delimeter=  .
Total number of delimeters= 2 Exception in thread "main" java.lang.StringIndexOu
tOfBoundsException: String index out of range: 2
    at java.lang.String.charAt(Unknown Source)
    at LexemesTokenizer.main(LexemesTokenizer.java:41)

这是代码

import java.util.Scanner;

public class LexemesTokenizer {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.print("input string: ");
        String s = scanner.next();

        char delimiter = ' ';

        // calculate number of delimiter characters
        int cntDelimeters = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) != delimiter) {
                cntDelimeters++;
            }
        }

        System.out.println("Input string= " + s);
        System.out.printf("Delimeter= %c.", delimiter);
        System.out.printf("\nTotal number of delimeters= %d ", cntDelimeters);
        String[] lexemes = new String[cntDelimeters + 1];

        // parse cntDelimeters+1 lexemes and store in an array
        int right = 0;
        int left = 0;

        for (int i = 0; i < cntDelimeters; i++) {
            while (s.charAt(right) != delimiter) {
                right++;
            }

            lexemes[i] = s.substring(left, right);
            right++;
            left = right;
        }

        lexemes[cntDelimeters] = s.substring(right, s.length());

        // print results for testing
        for (int i = 0; i < lexemes.length; i++) {
            System.out.printf("\n%d : %s", i, lexemes[i]);
        }
    }
}

第41行是:while(s.charAt(右)!=分隔符){

某些原因字符串s只是一个

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

好吧,你的字符串(s)不包含空格(你赋予delimiter的值)然后你这样做:

while (s.charAt(right) != delimiter) {
    right++;
}

因此飞越你的弦乐结束。

while (s.charAt(right) != delimiter && s.length > right)

会照顾好。

编辑:帮助输入字符串

你正在打电话

String s = scanner.next();

Scanner是输入解析器。这将返回输入的第一个单词(“a”),因为默认分隔符是空格。

如果您想要使用整个输入行:

 String s = scanner.nextLine();