为什么它显示 StringOutofbounds 异常,而我只比较两个字符串的第 0 个索引?

why is it showing stringoutofbounds exception while i am only comparing the 0th index of two strings?

提问人:Duddu Bala Guru Venkata Arjun 提问时间:8/26/2023 最后编辑:Dmitriy PopovDuddu Bala Guru Venkata Arjun 更新时间:8/26/2023 访问量:74

问:

我正在做一个 leetcode 问题,我得到了以下代码:String index out of range: 0 exception

    public boolean isInterleave(String s1, String s2, String s3) {
        int n = 0;
        int m = 0;
            
        if (s1.charAt(0) == s3.charAt(0)) {
            n++;

            for (int j = 1; j < s1.length(); j++) {
                if (s1.charAt(j) == s3.charAt(j)) {
                    n++;                        
                } else {
                    break;
                }
            }

            for (int j = 0; j < s2.length(); j++) {
                if (s2.charAt(j) == s3.charAt(j + n)) {
                    m++;                        
                } else {
                    break;
                }
            }
        }

        if (n > 0) {
            System.out.println(n);
        } else {
            System.out.println(m);
        }
    }

我试图计算一个字符串的两个字符串的字符数是相同的,就像在交错字符串问题中一样,并希望为 输入2,2s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"

Java 字符串 OutOfboundsException

评论

4赞 Tim Roberts 8/26/2023
索引 0 超出空字符串的边界。您需要先检查一下。
1赞 Hovercraft Full Of Eels 8/26/2023
您的错误消息告诉您原因:字符串的长度为 0。没有第 0 个元素。
0赞 John Bollinger 8/26/2023
或者,也许您一开始就不需要对比较进行特殊情况。s1.charAt(0) == s3.charAt(0)

答:

0赞 Andrés Alcarraz 8/26/2023 #1

为什么,是因为空字符串在位置 0 没有 char,但你只是不需要它。

如果字符串为空,第一个 for 循环将不会进入,但第二个会进入。s1

您可以在此之前添加一个用于检查空性,但我不知道在这种情况下您应该返回什么,如下所示:if

public boolean isInterleave(String s1, String s2, String s3) {
    if (s1.isEmpty() || s2.isEmpty() || s3.isEmpty() {
        return ...; //what's appropriate for this case
    }
... //your code.
}

我并不是说这是你应该做的来解决你的问题,只是如何避免你遇到的错误,并作为一种举例说明你为什么会遇到它的形式。

0赞 Reilas 8/26/2023 #2

“为什么它显示 stringoutofbounds 异常,而我只比较两个字符串的第 0 个索引?..."

如果我在 LeetCode 上运行此代码并出现交错字符串问题,则会出现以下错误。

java.lang.StringIndexOutOfBoundsException: String index out of range: 0
  at line 48, java.base/java.lang.StringLatin1.charAt
  at line 1513, java.base/java.lang.String.charAt
  at line 6, Solution.isInterleave
  at line 54, __DriverSolution__.__helper__
  at line 90, __Driver__.main

第 6 行是,

if (s1.charAt(0) == s3.charAt(0))

s1s3 为空的情况下,String#charAt 方法将引发 IndexOutOfBoundsException,它是 StringIndexOutOfBoundsException 的父类。

这是 String#charAt JavaDoc

抛出:

IndexOutOfBoundsException - 如果 index 参数为负数或不小于此字符串的长度。

您必须检查 s1s3 的内容。
我在这里使用 String#isEmpty 方法,它检查 String#length 是否为 0。

if ((!s1.isEmpty() && !s3.isEmpty()) && s1.charAt(0) == s3.charAt(0))

这应该会让你进入该过程的下一步。