【问题标题】:Java String index out of range : -1Java 字符串索引超出范围:-1
【发布时间】:2017-04-13 18:42:39
【问题描述】:

lang.StringIndexOutOfBoundsException 用于以下代码。程序检查没有空格的句子以提取与有效英语单词字典匹配的单词

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class WordCheckUtil{

boolean dictionaryContains(String word)
{
    List<String> dictionary = new ArrayList<String>(Arrays.asList("mobile","samsung","sam","sung",
                            "man","mango", "icecream","and",
                            "go","i","love","ice","cream"));

        if(dictionary.contains(word))
            return true;

    return false;
}

void wordCheck(String str){
    wordBreakCheck(str,str.length(),"");
}

void wordBreakCheck(String str, int length, String result){
    System.out.println(str+" "+length+" "+result);
    for (int i = 1; i <= length; i++) {
        String prefix = str.substring(0, i);
        System.out.println(prefix);
        if(dictionaryContains(prefix)){

            if(i == length){
                result += prefix;
                System.out.println("--> "+result);
                return;
            }
            System.out.println(i+" -- "+length);
            String subStr = str.substring(i,length-i);
            wordBreakCheck(subStr,length-i,result+prefix+" ");
        }
    }
}

public static void main(String[] args) {
    WordCheckUtil wr = new WordCheckUtil();
    wr.wordCheck("iloveice");
}

}

这是我得到的错误堆栈:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String 
index out of range: -1
    at java.lang.String.substring(String.java:1967)
    at WordCheckUtil.wordBreakCheck(WrodCheckUtil.java:36)
    at WordCheckUtil.wordBreakCheck(WrodCheckUtil.java:37)
    at WordCheckUtil.wordCheck(WrodCheckUtil.java:20)
    at WordCheckUtil.main(WrodCheckUtil.java:44)

【问题讨论】:

  • 显而易见的问题:WrodCheckUtil.java:36 是哪一行?
  • 是时候学习使用调试器了——这样做,问题就会变得显而易见。
  • 我检查了调试器,在抛出这个错误之前“i”和“length”的值是4和7

标签: java stringindexoutofbounds


【解决方案1】:

子字符串包含开始和结束索引,而不是长度。行:

str.substring(i,length-i); 

请求从索引i (4) 到index length-i (3) 的字符串,而不是剩余长度的字符串。

取出-i。

【讨论】:

  • 该行要求从索引“i”到索引“length-i”的字符串,不包括“length-i”,换句话说[i,length-i)
【解决方案2】:

你写道:

str.substring(i,length-i);

i 增加,并且在某一时刻 i 将 >= length - i

【讨论】:

  • 我检查了这一行,抛出这个错误之前的“i”和“length”的值分别是4和7
  • 所以你打电话给str.substring(4, 7-4)。开始索引 = 4,结束索引 = 3。范围 = -1。
  • 是的,这里的范围是-1。
猜你喜欢
  • 2012-06-04
  • 1970-01-01
  • 2016-02-19
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 2012-01-15
相关资源
最近更新 更多