理解java.lang.StringIndexOutOfBoundsException: length=X; regionStart=Y; regionLength=Z

4
如何解释a标签
java.lang.StringIndexOutOfBoundsException: length=30278; regionStart=6877; regionLength=-12

如何复现以下异常?

  • length 是正数,
  • regionStart 是正数且小于 length
  • regionLength 是负数?

这些属性到底是什么意思?在此异常的文档中并没有提到。

我只知道 java.lang.StringIndexOutOfBoundsException: String index out of range: X,其中X是一个负整数。可以通过以下方式复现:

String s = "hello world";
String chunk = s.substring(5, -8);

例如。

我问这个问题是因为在我的安卓应用程序中会抛出这样的异常。但是它很少被抛出。否则我会设置一个断点并查看发生了什么。

        java.lang.StringIndexOutOfBoundsException: length=30278; regionStart=6877; regionLength=-12
        at java.lang.String.startEndAndLength(String.java:298)
        at java.lang.String.substring(String.java:1087)
        ...
        my app specific calls here
        ...
        at android.view.View.performClick(View.java:5217)
        at android.view.View$PerformClick.run(View.java:21342)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5551)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

据我所知,导致此异常的操作是什么,我已在该位置设置了断点并打开了String类定义(因为Android有时使用标准java类的模拟)。但是当调试器停在那里时,String类中没有包含startEndAndLength方法...


1
@baao 这不是这个问题的副本 - Mark Rotteveel
1
我在String class和StringIndexOutOfBoundsException类中都没有看到regionLength,这表明它是通过throw new StringIndexOutOfBoundsException("length=" + length + ", regionStart=" + regionStart + ", regionLength=" + regionLength);在该类之外创建的。它实际上是从哪里抛出的?你能提供一些[mcve]和stacktrace吗? - Pshemo
1
捕获它并打印其堆栈跟踪以查看它被抛出的位置。 - rustyx
2个回答

0

好的。我成功捕获了异常并且现在能够推断出提到的属性的含义。 因此,如果你有这样一条指令:

text.substring(start, end)

length 将是 text 的长度(或 text.length()

regionStart 将是 start

regionLength 将是 (end - start)

现在看起来很简单,但如果你第一次看到它,当 StringIndexOutOfBoundsException 被抛出时,它并不像通常看到的那样清晰。


0

在方法定义中,如果regionstart大于regionend,则会出现此异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接