java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 - 数据库读取 - 安卓

7

我创建了一个从数据库读取数据并将其放入 String 数组的方法。 Android Studio没有给出语法错误,但当我启动我的应用程序时,日志显示:

03-19 16:31:20.938    2518-2518/com.mms.dailypill E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.mms.dailypill, PID: 2518
java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
        at com.mms.dailypill.DBManager.getMedicines(DBManager.java:56)

该方法的代码如下:
public String[] getMedicines()
{
    SQLiteDatabase db = dbManager.getWritableDatabase();
    String[] columns = {dbManager.getName(), dbManager.getFormat(), dbManager.getAmount(), dbManager.getExp_date(), dbManager.getTime()};
    Cursor cursor = db.query(dbManager.getTableName(), columns, null, null, null, null, null);
    String[] medicines = {};

    String name, format, exp_date, time;

    int amount;
    int count = 0;
    while(cursor.moveToNext())
    {
        name = cursor.getString(0);
        format = cursor.getString(1);
        amount = cursor.getInt(2);
        exp_date = cursor.getString(3);
        time = cursor.getString(4);
        medicines[count] = "Name: " + name + " Format: " + format + " Amount: " + amount + " Expiration Date: " + exp_date + " Time: " + time;
        count++;
    }
    db.close();
    return medicines;
}

根据日志显示,异常出现在第56行:

time = cursor.getString(4);

我读取的表格有6列: id, name, format, amount, exp_date, time。我只想显示整个表格,但不包括id列,所以当我调用getString()方法时,我从索引1开始而不是从0开始。
我真的不明白问题出在哪里,所以如果有人能帮助我,我将非常感激。 提前致谢!

4
“String[] medicines = {};” 应该改为 “String[] medicines = new String[cursor.getCount()];”,你可能也需要检查负数值。 - Blackbelt
@Blackbelt 谢谢,它解决了我的问题! - Federico Belotti
1
@Blackbelt orb,那是个非常好的答案!不要太害羞了。 - codeMagic
1
@codeMagic 神器,我一直在问自己“为什么”。 - Blackbelt
@codeMagic 真的很好奇.. "orb" 是什么? - Tia
@Tia 只是 Blackbelt 和我之间的一个内部玩笑。没什么有趣的。 - codeMagic
3个回答

12
java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 

即使你解决了你的问题,我还是想解释一下为什么会出现这个错误。当你初始化一个没有大小的空数组时,或者错误地初始化时,在这种情况下 String[] medicines = {}; 它是大小为0的空数组,然后他尝试在第一个不存在的索引0添加值,因此解决方案是根据列表大小进行初始化 String[] medicines = new String[cursor.getCount()];
注意:
数组是一个容器对象,它保存单一类型的固定数量的值。数组的长度在创建数组时确定。创建后,其长度是固定的。您已经在“Hello World!”应用程序的主方法中看到了数组的示例。本节详细讨论了数组。
总结:
一个数组被创建后,其大小是固定的,不像数组列表可以随意添加元素。 来源

2

在我的情况下,我需要请求数组的长度。

  if (bill_inputs.length>0){
                    textViewInputType.setText(bill_inputs[0].getInput_name());

                }

因此,对于您的情况,在执行任何操作之前,请检查长度。


0

如果您更改了数据库架构但未更新数据库版本,则会导致上述错误。


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