【问题标题】:Getting error : Caused by: java.lang.ArrayIndexOutOfBoundsException: length=3; index=4出现错误:原因:java.lang.ArrayIndexOutOfBoundsException: length=3;索引=4
【发布时间】:2019-01-26 11:39:42
【问题描述】:

我在以下代码中遇到错误。我试图在 SQLite 数据库中保存我的行进距离,但在 SQLite 数据库中出现错误。我不知道如何管理数组长度。我收到一个名为

的错误

java.lang.ArrayIndexOutOfBoundsException: length=3;索引=4。

public class ActivityLocationDaoImpl extends Dao implements ActivityLocationDao {

private static final String TABLE_NAME = "activity_location";
private static final String COLUMN_ID = "id";
private static final String COLUMN_LATITUDE = "latitude";
private static final String COLUMN_LONGITUDE = "longitude";
private static final String COLUMN_ACTIVITY = "activity";
private static final String COLUMN_DATE = "date";
private static final String[] COLUMN_ARRAY = new String[]{COLUMN_ID, COLUMN_LATITUDE, COLUMN_LONGITUDE, COLUMN_ACTIVITY, COLUMN_DATE};
public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (\n" +
        COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,\n" +
        COLUMN_LATITUDE + " INTEGER NOT NULL,\n" +
        COLUMN_LONGITUDE + " INTEGER NOT NULL,\n" +
        COLUMN_ACTIVITY + " INTEGER NOT NULL,\n" +
        COLUMN_DATE + " INTEGER NOT NULL\n" + ")";

public ActivityLocationDaoImpl(SQLiteDatabase database) {
    super(database);
}

@Override
public boolean insert(ActivityLocation activityLocation) {
    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_LATITUDE, activityLocation.getLocation().getLatitude());
    contentValues.put(COLUMN_LONGITUDE, activityLocation.getLocation().getLongitude());
    contentValues.put(COLUMN_ACTIVITY, activityLocation.getActivityType().getIndex());
    contentValues.put(COLUMN_DATE, activityLocation.getDate().getTime());

    return getDatabase().insert(TABLE_NAME, null, contentValues) != -1;
}

@Override
public List<ActivityLocation> listAll(Date currentDay) {

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(currentDay);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    currentDay = calendar.getTime();
    calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1);
    Date nextDay = calendar.getTime();

    Cursor cursor = getDatabase().query(TABLE_NAME, COLUMN_ARRAY, COLUMN_DATE + " > ? AND " + COLUMN_DATE + " < ?",
            new String[]{String.valueOf(currentDay.getTime()), String.valueOf(nextDay.getTime())},
            null, null, COLUMN_DATE + " ASC", null);

    List<ActivityLocation> activityLocationList = new ArrayList<>();
    while (cursor.moveToNext()) {
        activityLocationList.add(convertCursorToEntity(cursor));
    }
    return activityLocationList;
}

@Override
public List<ActivityLocation> listAll(Date startDate, Date finalDate) {

    Cursor cursor = getDatabase().query(TABLE_NAME, COLUMN_ARRAY, COLUMN_DATE + " > ? AND " + COLUMN_DATE + " < ?",
            new String[]{String.valueOf(startDate.getTime()), String.valueOf(finalDate.getTime())},
            null, null, COLUMN_DATE + " ASC", null);

    List<ActivityLocation> activityLocationList = new ArrayList<>();
    while (cursor.moveToNext()) {
        activityLocationList.add(convertCursorToEntity(cursor));
    }
    return activityLocationList;
}

public ActivityLocation convertCursorToEntity(Cursor cursor) {
    ActivityLocation activityLocation = new ActivityLocation();
    Location location = new Location();

    activityLocation.setId(cursor.getInt(0));
    location.setLatitude(cursor.getDouble(1));
    location.setLongitude(cursor.getDouble(2));
    activityLocation.setLocation(location);
    activityLocation.setActivityType(ActivityType.values()[cursor.getInt(3)]);
    activityLocation.setDate(new Date(cursor.getLong(4)));

    return activityLocation;
}

在这一行出现错误:

activityLocation.setActivityType(ActivityType.values()[cursor.getInt(3)]);

提前致谢。

【问题讨论】:

  • 如果数组的大小为3,那么只能用索引0、1、2访问
  • cursor的内容是什么?
  • @Jens 光标内容:Cursor cursor = getDatabase().query(TABLE_NAME, COLUMN_ARRAY, COLUMN_DATE + " &gt; ? AND " + COLUMN_DATE + " &lt; ?", new String[]{String.valueOf(currentDay.getTime()), String.valueOf(nextDay.getTime())}, null, null, COLUMN_DATE + " ASC", null);
  • 能否请您显示SQL语句
  • @MikeM。你的权利。我得到了解决方案。感谢您的建议和时间。

标签: java android arrays sqlite indexoutofboundsexception


【解决方案1】:

好吧,您不能访问只有 3 个元素的数组的第 4 个元素。大多数人会混淆这一点,因为他们有一点 C/C++ 的背景。 这就是 C/C++ 和 JAVA 的区别。 假设你有这样的东西:

int arr[] = {1,2,3};

现在,如果您在 C/C++ 中执行 arr[3],它将返回一些垃圾值,无论该特定地址存在什么,但在 JAVA 中,会抛出 ArrayIndexOutOfBoundsException。

【讨论】:

    【解决方案2】:

    Shravan,当只有 3 个值时,您无法从数组中获取第 4 个索引值。

    您只能访问 0,1,2 的索引值。

    在崩溃线上使用断点,你会得到一个清晰的画面。

    【讨论】:

      【解决方案3】:

      最有可能的是,游标只包含 3 个结果列。因此,您只能访问 0、1 和 2。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-30
        • 1970-01-01
        • 2015-06-03
        相关资源
        最近更新 更多