当前位置: 首页 > 面试题库 >

Android列表视图数组索引超出范围异常-没有线索?

弘焕
2023-03-14
问题内容

我有一个应用程序,该应用程序在打开时会加载一个列表视图,但是我遇到了数组索引超出界限异常的情况,却没有任何问题的根源。它正在尝试在某个地方访问index =
-1,但我不知道在哪里。

该应用程序从数据库加载家庭作业信息,将它们放入ArrayList中的单独的家庭作业对象中,然后从那里将其加载到ListView中。我真的不知道异常的来源,我已经检查了所有代码。列表中只有1个作业,但是该应用程序拒绝打开,并在我尝试打开它时立即关闭。这是LogCat的输出

谢谢

LogCat输出

01-11 16:38:43.644: E/AndroidRuntime(7267): FATAL EXCEPTION: main
01-11 16:38:43.644: E/AndroidRuntime(7267): java.lang.ArrayIndexOutOfBoundsException: length=29; index=-1
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.text.StaticLayout.calculateEllipsis(StaticLayout.java:738)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.text.StaticLayout.out(StaticLayout.java:702)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.text.StaticLayout.generate(StaticLayout.java:410)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.text.StaticLayout.<init>(StaticLayout.java:140)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.TextView.makeSingleLayout(TextView.java:5888)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.TextView.makeNewLayout(TextView.java:5745)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.TextView.onMeasure(TextView.java:6102)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:645)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:425)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.ListView.measureScrapChild(ListView.java:1183)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1248)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.ListView.onMeasure(ListView.java:1158)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.Choreographer.doFrame(Choreographer.java:532)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.os.Handler.handleCallback(Handler.java:725)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.os.Looper.loop(Looper.java:137)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at android.app.ActivityThread.main(ActivityThread.java:5039)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at java.lang.reflect.Method.invokeNative(Native Method)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at java.lang.reflect.Method.invoke(Method.java:511)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-11 16:38:43.644: E/AndroidRuntime(7267):     at dalvik.system.NativeStart.main(Native Method)

数据库加载

public ArrayList<HomeworkItem> getHomeworks() {
        String[] columns = new String[] { KEY_ROWID, KEY_TITLE, KEY_SUBJECT,
                KEY_DUE_DAY, KEY_DUE_MONTH, KEY_DUE_YEAR, KEY_NOTES,
                KEY_REMINDER_ONE, KEY_REMINDER_TWO };
        Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null,
                null, null);
        ArrayList<HomeworkItem> hwks = new ArrayList<HomeworkItem>();

        int id = c.getColumnIndex(KEY_ROWID);
        int iTitle = c.getColumnIndex(KEY_TITLE);
        int iSub = c.getColumnIndex(KEY_SUBJECT);
        int iDay = c.getColumnIndex(KEY_DUE_DAY);
        int iMonth = c.getColumnIndex(KEY_DUE_MONTH);
        int iYear = c.getColumnIndex(KEY_DUE_YEAR);
        int iNotes = c.getColumnIndex(KEY_NOTES);
        int iOne = c.getColumnIndex(KEY_REMINDER_ONE);
        int iTwo = c.getColumnIndex(KEY_REMINDER_TWO);

        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
            HomeworkItem h = new HomeworkItem();
            h.id = c.getInt(id);
            h.title = c.getString(iTitle);
            h.subject = c.getString(iSub);
            h.day = Integer.parseInt(c.getString(iDay));
            h.month = Integer.parseInt(c.getString(iMonth));
            h.year = Integer.parseInt(c.getString(iYear));
            h.notes = c.getString(iNotes);
            h.late = h.isLate();

            h.oneDayReminder = Boolean.parseBoolean(c.getString(iOne));
            h.twoDayReminder = Boolean.parseBoolean(c.getString(iTwo));
            hwks.add(h);
        }
        return hwks;
    }

ListView适配器

public class MyAdapter extends BaseAdapter { // adapter for list

        public MyAdapter(Context c) {

        }

        public int getCount() {
            // TODO Auto-generated method stub
            Log.d("hwk", hwks.size()+" is the size");
            return hwks.size();
        }

        public Object getItem(int position) {
            // TODO Auto-generated method stub
            Log.d("hwk", position+" being accessed");
            return position;
        }

        public long getItemId(int position) {
            // TODO Auto-generated method stub
            Log.d("hwk", position+" being accessed");
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            View v = convertView; // inflate the list
            TextView title, subject, dueDate, listLate;

            if (v == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.list, null);
                Log.d("hwk", "v inflated");
            }
            title = (TextView) v.findViewById(R.id.listTitle); // get the id's
                                                                // of fields
            subject = (TextView) v.findViewById(R.id.listSubject);
            dueDate = (TextView) v.findViewById(R.id.listDueDate);
            listLate = (TextView) v.findViewById(R.id.listLate);
            Log.d("hwk", "got views");

            title.setText(hwks.get(position).title);
            subject.setText(hwks.get(position).subject);
            String date = hwks.get(position).day + "/"
                    + (hwks.get(position).month + 1) + "/"
                    + hwks.get(position).year;
            dueDate.setText(date);
            Log.d("hwk", "some text set");

            if (hwks.get(position).late) { // set if they are late or not
                if (hwks.get(position).isToday()) {
                    listLate.setTextColor(Color.rgb(255, 165, 0));
                    listLate.setText("Due Today!");
                } else {
                    listLate.setTextColor(Color.RED);
                    listLate.setText("Late");
                }
            } else {
                listLate.setTextColor(Color.GREEN);
                listLate.setText("Ongoing");
            }
            Log.d("hwk", "returning v");
            return v;
        }

    }

编辑:另外,当我第一次在应用程序中添加作业时,ListView可以工作,它会刷新ListView并将作业添加到其中。发生这种情况时,我会完全重新加载主活动,因此在关闭应用程序一次后打开它似乎是一个问题。

编辑2:我从应用程序中删除了数据,添加了一个新的家庭作业,现在我无法重现该问题。

编辑3:检测到问题。这与一些文本有关。我已经得出结论,当我将“标题”设置为“ Binomial Expansion”时,它会重新产生以前在作业也称为“
Binomial Expansion”时出现的错误。可能与尝试将String放入TextView以及文本太大有关吗?

我扩展了TextView的宽度,它停止了错误。当我扩展文本时,我又遇到了问题。文本视图溢出一定是有问题的。我可以设置任何TextView属性来阻止它吗?


问题答案:

这是由于将android:ellipsize="middle"(或start)设置为TextView没有的android:singleLine="true"

例如,以下由于该错误而崩溃:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="middle"
    android:maxLines="1"
    android:text="blahblahblahblahblahblahblahblahblahbla---go really long" />

但是以下内容却没有:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="middle"
    android:singleLine="true"
    android:text="blahblahblahblahblahblahblahblahblahbla---go really long" />

参考:https :
//code.google.com/p/android/issues/detail?id=33868

注意:singleLine是已弃用的属性,但仍适用于Jelly Bean。



 类似资料:
  • 问题内容: 每当我运行xhtml时。它给了我以下例外。statusindex对象的值为5。我正在使用JQuery进行延迟滚动,因此当我的xhml页面getMoreStatusList调用getMoreStatusList函数时,它为我提供了超出范围的异常的索引。数据库中有26个状态更新,因此索引超出范围的异常对我来说毫无意义。 1)代码 2)例外 问题答案: 消息说是30。这不是您认为的5,而是2

  • 我使用Sqoop将数据从SQL server导入到本地HDF。我使用一个简单的自由形式查询从表中提取大约10行。下面是我从终端执行的sqoop命令: 当我从本地计算机执行此操作时,会出现以下异常: 原因:com。微软sqlserver。jdbc。SQLServerException:索引2超出范围。在com。微软sqlserver。jdbc。SQLServerException。在com上生成fr

  • 问题内容: 因此,我正在编写一个简单的程序来输入字符串并计算总数。的米 所以,这是我的代码 where 和str是我接受过的字符串,但是此错误不断出现 这是什么错误以及如何将其删除? 问题答案: 字符串,有效索引从0到n-1; 更改 至

  • 问题内容: 我已经开始处理我的第一个Java程序,它是一个简单的计算器,但是我得到一个错误,声称我的数组超出范围。我尝试对其进行调试,以了解这样做的原因和原因,并遵循纸上的代码,两者均显示了我期望和期望的结果。因此,我看不到问题出在哪里。代码不完整。 根据调试器,此行出现错误: 这是我当前拥有的代码的主要部分: 这是我收到的错误消息: 问题答案: 当等于中的最后一个元素索引时,则将大于最后一个元素

  • 问题内容: 我在读取CSV文件时遇到此错误(无标题,3列,第二和第三字符串): 这是下面代码的一部分。坚持起来简直是愚蠢的简单事情,但是对于如何工作我只是空白。我是编码的新手,但是之前已经处理过csv模块,并且从来没有遇到过这方面的问题,只是在记事本中制作了一些测试csv文件,以查看是否可以从相同的代码中读取它,并且可以。我不知道。 问题答案: 尝试检查空白行。另外,请避免将其用作变量名。是打开的

  • 你好,stackoverflow的好人们!我有一个奇怪的问题,我不明白。我要发布我的两个有问题的方法: 另一个: 所以,我正在根据我在网上找到的一些代码制作一个数独解算器。现在,当我试着调试程序时,我可以很好地检查一些行(并且它按照预期工作),但是一旦程序第一次在方法“resi”中调用“next”方法,它就会崩溃,出现数组索引越界异常。如果我只是尝试在不进行调试的情况下运行该程序,那么在同一方法调