字符串索引超出范围:java

时间:2015-07-04 17:36:23

标签: java string

我只是想创建一个可以将自然语言转换为sql查询的应用程序,在这个片段中我想从给定的字符串中提取数字。我不知道为什么我会收到此错误。无论我输入的长度如何,都会产生相同的错误。

public void insert(String low) {
    String character = low;
    int l = low.length();
    int j[] = new int[20];
    int m = 0;

    for (int k = 0; k <= 2; k++) {
        for (int i = 0; i <= l; i++) {
            char c = character.charAt(i);
            if (Character.isDigit(c)) {
                String str = Character.toString(c);
                j[k] = (j[k] * 10) + Integer.parseInt(str);
                m++;

            } else if (Character.isLetter(c)) {
                if (m > 2) {
                    break;
                }
            }
        }
    }

    for (int k = 0; k <= 2; k++) {
        jTextField2.setText(Integer.toString(j[k]));
    }
}

public void check(String low) {
    int j;
    String[] ins = {"into", "add", "insert"};
    String cc = low;

    for (int i = 0; i < 2; i++) {
        String dd = ins[i];
        if (cc.contains(dd)) {
            j = 1;
            insert(cc);
            break;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

变化

 for(int i=0;i<=l;i++)
 {
    char c = character.charAt(i);
    ..........
 }

  for(int i=0;i<l;i++)
 {
    char c = character.charAt(i);
    ..........
 }

当您编写i<=l时,循环的最后一次迭代将执行character.chatAt(l),这不存在,因为索引从0开始,只有0,1,2, .....l-1个字符可用。因此执行character.chatAt(l)会引发IndexOutofBound异常,这是一种自我解释。

答案 1 :(得分:0)

如果您尝试提取字符串中的所有数字,我强烈建议您使用regular expressions而不是编写自己的代码来循环字符。这样的事情怎么样:

public List<Integer> extractNumbers(String line){
    // Construct regex
    Pattern digitsPattern = Pattern.compile("\\d+");
    Matcher m = digitsPattern.matcher(line);

    // Compile into list
    List<Integer> numberList = new ArrayList<Integer>();
    while (m.find()){
        numberList.add(Integer.parseInt(m.group()));
    }

    return numberList;
}

正则表达式非常强大,成熟和优雅 - 正如您在此处所看到的,您可以通过几个相当简单的行来完成此操作,如果您需要更改匹配规则,您将会有一个更简单的工作