尝试使用子字符串时索引超出范围

时间:2017-09-30 01:03:08

标签: java

我制作了一个简单的程序来拼写单词。该程序有2个输入,一个String数组作为字典,String作为一个句子。程序检查句子(单词到单词)并检查字典以找到一个单词,然后询问用户是否打算在单词中写下单词。

要求: 前2个字符必须相同。 字典中的单词只能比句子单词多2个字符。 字典中的单词只能有2个不同的字符而不是句子中的单词。 (唯一计算的字符是索引在0和句子长度之间的字符。例如efg和egg | s)

public static String SpellCheck(String[] dictionary, String sentence){
        Scanner sc = new Scanner(System.in);
        String newSentence = "";
        StringTokenizer divisor = new StringTokenizer(sentence);
        while(divisor.hasMoreElements()){
            String word = divisor.nextToken();
            String a = "";
            for(int i = 0; i<dictionary.length; ++i){
                int n  = 0;
                if(word.length()>2 && dictionary[i].length()-word.length()<=2 && word.substring(0,2).indexOf(dictionary[i].substring(0,2))==0){
                    String s1 = word.substring(2,word.length());
                    String s2 = dictionary[i].substring(2,dictionary[i].length());
                    for(int k = 0; k<s1.length(); ++k){
                        String l1 = s1.substring(k,k+1);
                        String l2 = s2.substring(k,k+1);
                        if(l1.indexOf(l2)!=0)++n;
                    }
                    if(n<=2){
                        System.out.print(dictionary[i] + "?");
                        a = sc.nextLine();
                        if("yes".indexOf(a)==0){
                            newSentence += dictionary[i] + " ";
                            break;
                        }
                    }
                }  
            }
            if("yes".indexOf(a)!=0)newSentence += word + " ";
        }
        return newSentence;
    }

问题在于

String s2 = dictionary[i].substring(2,dictionary[i].length());

它适用于句子中的第一个单词,但在第二次我收到错误说&#34;字符串索引超出范围&#34;我无法弄清楚为什么我会使用.length()来查找最后一个字母的索引。我希望有人可以帮我弄清楚这个程序有什么问题。谢谢!

2 个答案:

答案 0 :(得分:1)

我相信您的错误位于您已经说错误

的下方的for循环中
String s2 = dictionary[i].substring(2,dictionary[i].length());

for(int k = 0; k<s1.length(); ++k){ //HERE
    String l1 = s1.substring(k,k+1);
    String l2 = s2.substring(k,k+1);
}

设置l1和l2时,将超出字符串索引的范围。 for循环应该读

for(int k = 0; k < s1.length()-1; ++k){

答案 1 :(得分:0)

如果长度小于2怎么办?你的起始指数是2。