Android java.lang.ArrayIndexOutOfBoundsException: length=10; index=10 安卓java.lang.ArrayIndexOutOfBoundsException:长度=10;索引=10

24

我无法弄清楚这个问题。在我的手机上(Nexus 4)无法复现。似乎不影响所有设备,但我已经收到足够多的报告了,看到它一直发生令人沮丧。

java.lang.ArrayIndexOutOfBoundsException: length=10; index=10
at android.text.StaticLayout.calculateEllipsis(StaticLayout.java:938)
at android.text.StaticLayout.out(StaticLayout.java:859)
at android.text.StaticLayout.generate(StaticLayout.java:524)
at android.text.StaticLayout.<init>(StaticLayout.java:147)
at android.widget.TextView.makeSingleLayout(TextView.java:6583)
at android.widget.TextView.makeNewLayout(TextView.java:6429)
at android.widget.TextView.onMeasure(TextView.java:6807)
at android.view.View.measure(View.java:16047)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1232)
at android.widget.TableRow.onMeasure(TableRow.java:114)
at android.view.View.measure(View.java:16047)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4921)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
at android.widget.TableLayout.measureChildBeforeLayout(TableLayout.java:464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.TableLayout.measureVertical(TableLayout.java:476)
at android.widget.TableLayout.onMeasure(TableLayout.java:439)
at android.view.View.measure(View.java:16047)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4921)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16047)
at android.widget.ListView.measureScrapChild(ListView.java:1190)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1255)
at android.widget.ListView.onMeasure(ListView.java:1165)
at android.view.View.measure(View.java:16047)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4921)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16047)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4921)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:16047)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16047)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4921)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2418)
at android.view.View.measure(View.java:16047)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2129)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1282)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1493)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1179)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4861)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
at android.view.Choreographer.doCallbacks(Choreographer.java:562)
at android.view.Choreographer.doFrame(Choreographer.java:532)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5293)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)

3
我是一个Java程序员,而不是Android程序员,但是长度为10的数组具有索引0、1、2、3、4、5、6、7、8、9。在某些情况下,您可能会访问不存在的索引10。 - Richard Tingle
2
要发布哪些代码?这似乎与我的布局有关,它是XML格式的? - Paul
6个回答

38

2
我有同样的问题,如果我需要设置setLines(2..X),那么这个单行="true" 的解决方法可能无法奏效。 - Petr Nalevka
正确的,android:singleLine="true" 是必要的。奇怪的是,它已经被弃用了(曾经在过去),而文档并没有将其列为要求:“您通常还需要设置scrollHorizontally或singleLine,以便整个文本也被限制为单行,而不是仍然允许被分成多行。” http://developer.android.com/reference/android/widget/TextView.html#attr_android:ellipsize - caw
6
如果我想要一个多行的省略号,使用android:ellipsize="end"和android:maxLines="3"还有android:singleLine="false"会崩溃吗? - Frank
我遇到了同样的问题。我应该在哪里添加这两行代码? - Dhiraj Devkar

4

问题

  1. 如果我们设置android:maxLines="1" android:ellipsize="middle",那么我们的应用程序会在某些设备上崩溃。

解决方案

  1. Android文档表示,当我们设置"android:maxLines"属性时,对于"android:ellipsize"属性只支持EndMarquee

参考资料

setEllipsize

API级别1中添加

void setEllipsize (TextUtils.TruncateAt where)

当文本中的单词长度超过视图宽度时,将其省略而不是在中间断开。您可能还希望使用setSingleLine()或setHorizontallyScrolling(boolean)将文本限制为一行。使用 null 将取消省略。如果已使用setMaxLines(int)设置了两行或更多行,则仅支持END和MARQUEE(其他省略类型将不起作用)。


4

0

他们至少应该把这个加入到Lint中!:S 你可以使用自定义的TextView来修复这个问题。

public class MyTextView extends TextView {
    public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyTextView(Context context) {
        super(context);
        init();
    }

    private void init() {

        // this is to overcome the calculateEllipsis bug in some versions of android, I spotted it on 4.4.4 and 4.4.3
        // see https://code.google.com/p/android/issues/detail?id=33868

        if (Build.VERSION.SDK_INT >= 16) {
            if (getMaxLines() == 1) {
                setSingleLine(true);
            }
        }
    }
}

在你的xml中,使用MyTextView而不是普通的TextView。

-3

数组的索引从0开始,到数组长度减去1结束。所以循环限制为9


9
因为堆栈跟踪清楚地指出IndexOutOfBounds不在客户端代码中,而是在Android原生代码中。 https://dev59.com/1GQn5IYBdhLWcg3wJ0e5#18564198 - 这是一个正确的答案。 - Yan.Yurkin

-5

将 for 循环修改为以下形式

你的数组长度为 0 到 10

for (int i=0; i<9; i++)
{
      System.out.println("value is  ofposition"+yourArrayList[i]);
}

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