web-dev-qa-db-ja.com

java.lang.ArrayIndexOutOfBoundsException:length = 0; index = 0-データベースの読み取り-Android

データベースからデータを読み取り、それを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);
_

私が読んだテーブルには、idnameformatamount、_exp_date_、timeの6つの列があります。 id列なしでテーブル全体を表示したいので、getString()メソッドを呼び出すときは、_1_からではなく、インデックス_0_から開始します。

どこに問題があるのか​​よくわからないので、誰か助けてくれたらありがたいです。前もって感謝します!

6
_Java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 
_

あなたもあなたの問題を解決しますが、私はこのエラーが発生した理由を説明したいと思います、このエラーはサイズなしで空の配列を初期化するときに発生します、またはこの場合は間違った初期化_String[] medicines = {};_サイズ0で空です、そして彼は値を追加しようとします最初はインデックス0が存在しないため、ソリューションはリストサイズString[] medicines = new String[cursor.getCount()];で初期化されます。

通知

配列は、単一の型の値を固定数保持するコンテナオブジェクトです。配列の長さは、配列の作成時に確立されます。作成後、その長さは固定されます。 「HelloWorld!」のメインメソッドで、配列の例をすでに見てきました。応用。このセクションでは、アレイについて詳しく説明します。

概要

作成された1つの配列は、必要に応じて追加できる配列リストとは異なり、固定サイズを取ります。

ソース

12
Mina Fawzy

私の場合、配列の長さを要求する必要がありました

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

                }

したがって、私たちの場合は、何かをする前に長さを確認してください

2
Goodlife