Java String索引超出范围错误

时间:2015-04-16 20:00:26

标签: java

我遇到了一些我不知道如何修复的java代码的问题。我想知道我是否可以找到一些帮助,弄清楚为什么我一直在

java.lang.StringIndexOutOfBoundsException: String index out of range: 1

这是弹出问题的代码片段(它是作业的一个更大的包的一部分......):

public class MyMapper extends Mapper {

@Override
//method takes docName and data as string
public void map(String documentID, String document) {

    //this string array hold all the delimiters for our split
    //String[] separators = {",", ".", "!", "?", ";", ":", "-", "' "," "};

    //splits the string 'document' according to delimiters
    String[] words = document.split(",|\\.|\\!|\\?|\\;|\\:|\\-|\\' |\\ |\\'.");


    // for each word in String[] words, check that each word is legitimate
    for (String word : words) {

        if (isAlpha(word)){
            //System.out.println(word);
            emit(word.substring(0, 1).toUpperCase() , "1");
        }

        else;

    }
}


// private helper method to check that each word is legitimate (alphas-only)
private boolean isAlpha(String name) {
char[] chars = name.toCharArray();

for (char c : chars) {
    if(!Character.isLetter(c)) {
        return false;
    }
}

return true;
}

}

我要做的是接收一个文档(通过bufferedReader以字符串形式存储)并抓住文档中每个单词的第一个字母,并将它们大写。

*****更新了代码*****

我决定在私人助手方法中使用建议检查空的“单词”。现在一切都有效。

以下是用于文档目的的更新代码:

// private helper method to check that each word is legitimate (alphas-only)
private boolean isAlpha(String name) {

if (name.equals("")) 
    return false;

char[] chars = name.toCharArray();

for (char c : chars) {
    if(!Character.isLetter(c)) {
        return false;
    }
}

return true;

4 个答案:

答案 0 :(得分:1)

有时您的word似乎是空的。首先进行检查,看看您是否有需要处理的事项:

if (isAlpha(word)){        
    if(!word.isEmpty()){ //you could also use 'if(word.length == 0)'
       emit(word.substring(0, 1).toUpperCase() , "1");
    }
}

或者,在isAlpha()方法中进行检查。

答案 1 :(得分:1)

如果你的单词是空的,只需从你的isAlpha()中返回一个假的

private boolean isAlpha(String name) {

if (name.equals(""))
       return false;
char[] chars = name.toCharArray();

for (char c : chars) {
    if(!Character.isLetter(c)) {
        return false;
    }
}

return true;
}

}

答案 2 :(得分:1)

对于某些字符串,您的split正则表达式可以生成空字符串,例如,在逗号后面跟一个空格的不常见的情况下,例如,字符串document = "Some words, with comma.";将是分成[Some, words, , with, comma]

我建议使用\W字符类(非字母数字字符),并允许其中的多个,即words = document.split("\\W+");,而不是枚举您可以想到的所有非单词字符。这样就可以[Some, words, with, comma]

如果您需要更多地控制要分割的字符并且不想使用字符类,您仍然可以将字符放入[...]+以缩短正则表达式并按分割使用words = document.split("[|.!?,;:' -]+")的那些组。 (在[...]内,只要-是最后一个,你就不需要逃避所有这些,所以它是明确的。)

答案 3 :(得分:0)

会这样吗?

    String text = "es saß ein wiesel, auf einem kiesel.";

    String[] parts = text.split("\\s+");

    StringBuilder resultingString = new StringBuilder();
    for (String part : parts) {
        part = Character.toUpperCase(part.charAt(0))
                + part.substring(1, part.length());
        resultingString.append(part + " ");
    }

    text = resultingString.toString().substring(0,
            resultingString.length() - 1);

    System.out.println(text);