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

标签 java exception

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

那就是错误:java.lang.StringIndexOutOfBoundsException: String index out of range: 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)); 
        }
    }
}

最佳答案

首先,恭喜您开始使用 Java。这是一种了不起的语言,而且可能性是无穷无尽的。以下是如何修复错误。

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

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围: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))) {

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

关于java.lang.StringIndexOutOfBoundsException : String index out of range: 1 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33727742/

相关文章:

java - 优化 Spring RestControllerAdvice 多个异常

c++ - 为什么在我的 C++ 代码中会抛出这个异常?

java - 将 String 转换为另一个类中的数组名称

java - 为什么我无法检查字符串中字符的成员资格?

java - 为什么使用的堆突然减少?

java - 将字符串从 JNI (C++) 代码返回到 Java

由于未知原因引发 java.io.FileNotFoundException

c# - 异常:指定类别中不存在实例 'Name of instance'

java - Log4j 在程序中间重新初始化自身

java - 创建 Hibernate 对象的外部库