字符串索引超出范围:-1在拥挤的情况下如果'声明

时间:2017-04-01 06:25:45

标签: java string if-statement exception indexoutofrangeexception

我正在运行一个程序来解析网站上的文本,然后拼写检查包含所有文本的字符串,并将其从HTML标记中清除。

一旦拼写检查器到达字符串的末尾,它就会返回此异常。 我看到类似的问题通过在&#34中设置索引大于0来解决;如果"声明,但我一直在努力解决这个问题已经有一段时间了,并希望得到一些帮助来解决这个问题。

抛出异常:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at ParseCleanCheck.checkWord(ParseCleanCheck.java:173)
    at ParseCleanCheck.SpellChecker(ParseCleanCheck.java:101)

Java第173-175行是删除任何标点符号的字词:

if (length > 2 && word.substring(length - 2).equals(",\"") || word.substring(length - 2).equals(".\"")
                || word.substring(length - 2).equals("?\"") || word.substring(length - 2).equals("!\"")) {
            unpunctWord = word.substring(0, length - 2);

下面记录第101行,我添加了可能属于抛出异常的相关周围代码

String user_text = "";
user_text = cleanString;
while (!user_text.equalsIgnoreCase("q")) {
                // check if necessary or if cleanString still works
                // PageScanner();
                user_text = cleanString;
                String[] words = user_text.split(" ");

                int error = 0;

                for (String word : words) {
                    suggestWord = true; // ~~~ Line 101 ~~~~
                    String outputWord = checkWord(word);

                    if (suggestWord) {
                        System.out.println("Suggestions for " + word + " are:  " + suggest.correct(outputWord) + "\n");
                        error++;
                    }
                }

                if (error == 0 & !user_text.equalsIgnoreCase("q")) {
                    System.out.println("No mistakes found");
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }

1 个答案:

答案 0 :(得分:0)

如果您应该更改条件,则问题在于,您只检查第一个条件是否为length > 2

if (length > 2 && word.substring(length - 2).equals(",\"") 
        || word.substring(length - 2).equals(".\"")
        || word.substring(length - 2).equals("?\"") 
        || word.substring(length - 2).equals("!\"")) {
            unpunctWord = word.substring(0, length - 2);

更改为:

if (length > 2 
        && (word.substring(length - 2).equals(",\"") 
        || word.substring(length - 2).equals(".\"")
        || word.substring(length - 2).equals("?\"") 
        || word.substring(length - 2).equals("!\""))) {
        unpunctWord = word.substring(0, length - 2);