【问题标题】:Android java.lang.ArrayIndexOutOfBoundsException: length=10; index=10Android java.lang.ArrayIndexOutOfBoundsException: 长度=10;指数=10
【发布时间】:2013-06-07 11:36:25
【问题描述】:

我很难弄清楚这一点。我无法在我的手机上重现(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)

【问题讨论】:

  • 我是 java 人而不是 android 人,但是长度为 10 的数组的索引为 0,1,2,3,4,5,6,7,8,9。在某些时候,您正在访问一个不存在的索引 10
  • 要发布什么代码?这看起来像是我的 XML 布局的问题?

标签: java android


【解决方案1】:

Array 索引从 0 开始并在 array length 减去 1..所以将循环限制为 9

【讨论】:

  • -1,因为堆栈跟踪清楚地指出 IndexOutOfBounds 不在客户端代码中,而是在 Android 的本机代码中。 stackoverflow.com/a/18564198/1855764 - 这是一个正确的答案
【解决方案2】:

需要设置属性android:lines="1" android:singleLine="true" https://code.google.com/p/android/issues/detail?id=33868

【讨论】:

  • 我有同样的问题,如果我需要 setLines(2..X) 怎么办,而不是 singleLine="true" 解决方法可能行不通
  • 正确,android:singleLine="true" 是必要的。奇怪的是,考虑到它已经被弃用(过去一次)并且文档没有将它列为 requirement:“您通常还希望设置 scrollHorizo​​ntally 或 singleLine 以便文本作为一个整体,也被限制在一条线上,而不是仍然允许被分成多条线。” developer.android.com/reference/android/widget/…
  • 如果我想要多行省略号怎么办? android:ellipsize="end" and android:maxLines="3" and android:singleLine="false",会崩溃吗?
  • 我遇到了同样的问题。我应该在哪里添加这两行?
【解决方案3】:

他们至少应该将这个添加到 Lint 中! :S 您可以使用自定义文本视图来解决此问题。

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。

【讨论】:

    【解决方案4】:

    这是一个错误。在android本身报告请忽略使用start。 https://code.google.com/p/android/issues/detail?id=33868

    【讨论】:

      【解决方案5】:

      把 for 循环改成这样

      你的数组长度 0 到 10

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

      【讨论】:

        【解决方案6】:

        问题

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

        解决方案

        1. Android 文档说,当我们设置 "android:maxLines" 属性时,"android:ellipsize" 属性仅支持 EndMarquee

        参考

        setEllipsize

        在 API 级别 1 中添加

        void setEllipsize (TextUtils.TruncateAt where)
        

        使文本中长于视图宽度的单词被椭圆化而不是在中间断开。您可能还需要 setSingleLine() 或 setHorizo​​ntallyScrolling(boolean) 将文本限制为单行。使用 null 关闭省略号。 如果已使用 setMaxLines(int) 设置两行或多行,则仅支持 END 和 MARQUEE(其他省略号类型不会做任何事情)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-27
          • 2019-12-29
          • 2018-11-05
          • 2015-08-09
          • 1970-01-01
          • 2018-06-01
          相关资源
          最近更新 更多