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

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:1,java,exception,Java,Exception,我正在学习Java,我不知道这里出了什么问题。为什么会发生这种错误?我没有发现任何错误,直到我在第二个for循环之前编写了行计数=0时,这才真正起作用 这就是错误:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:1 这是发生错误的地方: if(mots.get(j).startsWith(searchPhrase.substring(0,1))){ 以下是完整的代码: import java.util.*; public class T

我正在学习Java,我不知道这里出了什么问题。为什么会发生这种错误?我没有发现任何错误,直到我在第二个for循环之前编写了行计数=0时,这才真正起作用

这就是错误: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)); 
        }
    }
}

正如@ray所说的,检查异常消息表明问题发生在searchPhrase为空字符串时。在本例中,我们尝试从一个size=0的空字符串中请求一个子字符串0,1,这样我们将得到一个StringIndexOutOfBoundsException。为了避免这种情况,我们可以首先检查并确认SearchPhase的大小>0

因此,一个快速修复方法是将行if-mots.getj.startsWithsearchPhrase.substring0,1{替换为if-searchPhrase.length>0&&mots.getj.startsWithsearchPhrase.substring0,1{

类似地,您可能希望将if count==mots.size{更改为if searchPhrase.length>0&&count==mots.size{

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

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

正如@ray所说,检查异常消息表明问题发生在SearchPhase为空字符串时。在这种情况下,我们尝试从size=0的空字符串中请求substring0,1,因此我们将获得StringIndexOutOfBoundsException。为了避免这种情况,我们可以先检查并确认SearchPhase的大小>0

因此,一个快速修复方法是将行if-mots.getj.startsWithsearchPhrase.substring0,1{替换为if-searchPhrase.length>0&&mots.getj.startsWithsearchPhrase.substring0,1{

类似地,您可能希望将if count==mots.size{更改为if searchPhrase.length>0&&count==mots.size{

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

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

首先,祝贺您开始使用Java。它是一种令人惊叹的语言,可能性无穷。下面是您如何着手修复错误的方法

第一步是准确理解错误的含义,让我们开始吧

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

引发的异常类型是StringIndexOutOfBoundsException。每当您获得IndexOutOfBoundsException或其任何类型时,都意味着您试图访问不存在的数组中的索引。通过调用substring方法,您可以将字符串拆分为字符数组,并在0到1的情况下选择字符a到B。如果字符1不存在,但您尝试访问它,它将抛出此错误

因此,出现此错误的原因是您试图对少于1个字符的字符串执行子字符串0,1,也就是空字符串,甚至可能是空字符串

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

改变

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


通过这样做,您可以在执行substring方法之前检查字符串的长度是否足够。首先,祝贺您开始使用Java。这是一种令人惊叹的语言,而且可能性是无穷的。下面是如何修复错误的

第一步是准确理解错误的含义,让我们开始吧

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

引发的异常类型是StringIndexOutOfBoundsException。每当您获得IndexOutOfBoundsException或其任何类型时,都意味着您试图访问不存在的数组中的索引。通过调用substring方法,您可以将字符串拆分为字符数组,并在0到1的情况下选择字符a到B。如果字符1不存在,但您尝试访问它,它将抛出此错误

因此,出现此错误的原因是您试图对少于1个字符的字符串执行子字符串0,1,也就是空字符串,甚至可能是空字符串

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

改变

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


通过这样做,您可以在使用调试器执行子字符串方法之前检查字符串的长度是否足够,您应该能够找到问题所在。这是每个程序员都应该擅长的一项关键技能,现在正是您开始学习它的最佳时机。祝您好运:我一直是t在过去的一个小时里一直在尝试。但仍将继续尝试。@IanPierre尝试将其分解为多个方法。有

分解工具,例如Eclipse和IntelliJ IDEA中的Extract方法,使这变得很容易。@IanPierre我喜欢您使用的是入门级接口。好极了。我看到人们在有偿工作中忽略了这一点,所以你们已经开始成为一名真正的软件工匠了:听到这一点感觉很好,伙计们。非常感谢。使用调试器逐步完成代码,您应该能够找到问题所在。这是每个程序员都应该擅长的一项关键技能,现在正是开始学习它的最佳时机。祝你好运:我已经试了一个小时了。但我会继续尝试,尝试将其分解为多个方法。Eclipse和IntelliJ IDEA中有重构工具,例如Extract Method,使这变得很容易。@IanPierre我喜欢您使用的是入门级接口。好极了。我看到人们在有偿工作中忽略了这一点,所以你们已经开始成为一名真正的软件工匠了:听到这一点感觉很好,伙计们。谢谢大家!@当然,我已经修改了我的答案。请看一看,看看这是否有意义。谢谢我在字符串搜索短语中添加了一些字母,在另一行中得到了相同的错误消息。即使我添加searchPhrase.length>0&&这是一行:if searchPhrase.charAtt==mots.getj.charAtt{即使我更改字符串的字符长度保持不变,也会出现此错误。我想我知道发生了什么。在程序运行时,SearchPhase的字符数将少于ArrayList中的字符串数。我必须找到一种方法来解决此问题。@IanPierre当然,我已修改了我的答案。请查看如果这有意义。谢谢!我在字符串searchPhrase中添加了一些字母,并且在其他行中收到了相同的错误消息。即使我添加searchPhrase.length>0&&这是一行:if searchPhrase.charAtt==mots.getj.charAtt{即使我更改字符串的字符保持相同的长度,我也会遇到此错误。我想我知道发生了什么。在程序运行时,SearchPhase的字符数将少于ArrayList中的字符串数。我必须找到一种方法来解决此问题。感谢您提供的惊人答案。我想成为一名移动开发人员,所以JAVA是reall很重要。我通过阅读you answer和Tsung Ting Kuo answer了解了我的错误。这不是我真正的代码,我只是想找出更大工作的一部分。再次感谢你的精彩回复。感谢你令人惊讶的回答。我想成为一名移动开发人员,所以JAVA非常重要。我通过阅读you answer和T了解了这一点宋定国回答我的错误是什么。这不是我真正的代码,我只是想找出一个更大的工作的一部分。再次感谢你的精彩回复。