java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:1

时间:2015-11-16 02:42:58

标签: java exception

我正在学习Java,但我不知道这里有什么问题。为什么会发生这种错误?我没有看到任何错误,这实际上是有效的,直到我写下这一行" count = 0"在第二个" for"之前循环。

这是错误:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:1

发生错误的行:

if(mots.get(j).startsWith(searchPhrase.substring(0,1))){

以下是整个代码:

import java.util.*;

public class Test {
    public static void main(String[] args) {
        List<String> mots = new ArrayList<>();
        List<String> saida = new ArrayList<>();
        mots.add("un");
        mots.add("deux");
        mots.add("trois");
        String searchPhrase = "aaasdeuxctsundesle";
        int count = 0;
        int countAnula = 0;
        int azul = 0;
        String anula = "-"; //Tem que fazer cast para char depois
        String frase = searchPhrase;
        for (int i = 0; i < frase.length(); i++) {
            count = 0;
            for (int j = 0; j < mots.size(); j++) {
                if (mots.get(j).startsWith(searchPhrase.substring(0,1))) {
                    for (int t = 0; t < mots.get(j).length(); t++) {
                        if (searchPhrase.charAt(t) == mots.get(j).charAt(t)) {
                            azul ++;
                        } else {
                            break;
                        }
                    }
                    if (azul == mots.get(j).length()) {
                        saida.add(mots.get(j)); 
                        searchPhrase = searchPhrase.substring(mots.get(j).length());
                        j = 0;
                        azul = 0;
                    } else {
                        searchPhrase = searchPhrase.substring(1);
                        saida.add(anula);
                        j = 0;
                        azul = 0;
                    }
                } else {
                    count ++;
                }        
            } 
            if (count == mots.size()) {
                searchPhrase = searchPhrase.substring(1);
                saida.add(anula);
                count = 0;
            }   
        }
        for (int g = 0; g < saida.size(); g++) {
            System.out.println(saida.get(g)); 
        }
    }
}

2 个答案:

答案 0 :(得分:8)

首先,祝贺Java入门。它是一种令人惊叹的语言,可能性无穷无尽。以下是修复错误的方法。

第一步是准确理解你的错误意味着什么,所以让我们来做吧!

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

抛出的异常类型是StringIndexOutOfBoundsException。无论何时获得IndexOutOfBoundsException(或其任何类型),都意味着您正在尝试访问不存在的数组中的索引。通过调用substring方法,您将字符串数组中的字符串分开,并选择字符A到B(在您的情况下为0到1)。如果字符1不存在,但您尝试访问它,则会抛出此错误。

因此,您收到此错误的原因是您尝试在少于1个字符的字符串上执行substring(0,1),也就是空字符串甚至是空字符串。

另外,给你一个快速提示。通常,如果方法体扩展了12行,则应该创建一个新方法。这将极大地提高代码的可读性。我花了一段时间才找到适合您修复的地方: - )

更改

if (mots.get(j).startsWith(searchPhrase.substring(0, 1))) {

if (searchPhrase != null && searchPhrase.length() > 0 && mots.get(j).startsWith(searchPhrase.substring(0, 1))) {

通过执行此操作,您可以在执行子字符串方法之前检查字符串的长度是否足够

答案 1 :(得分:1)

正如@ray所说,检查异常消息表明当searchPhrase为空字符串时会出现问题。在这种情况下,我们会尝试从substring(0, 1)的空字符串中请求size = 0,因此我们会得到StringIndexOutOfBoundsException。为避免这种情况,我们可以先检查并确认searchPhrase的大小为> 0

因此,快速解决方法是将行if (mots.get(j).startsWith(searchPhrase.substring(0, 1))) {替换为if (searchPhrase.length() > 0 && mots.get(j).startsWith(searchPhrase.substring(0, 1))) {

同样,您可能希望将if (count == mots.size()) {更改为if (searchPhrase.length() > 0 && count == mots.size()) {

我修改了上面两行,可以毫无例外地运行代码。输出是:

-
-
-
-
deux
-
-
-
un
-
-
-
-
-