获得"Variable might not initialized error"



我正在为Sqlite数据库创建函数,并获得"变量可能未初始化";错误我正在尝试将sqlite数据存储在字符串数组中。


public String[] gettitle()
{
String title[];
String s = "select Title from User_DB;";
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(s,null);
int a = 0;
while(cursor.moveToNext())
{
title[a] = cursor.getString(0);
a++;
}
return title;
}

它说title[]没有初始化,但我不明白为什么。我清楚地初始化了它。

  1. 声明title。允许的C语言样式为String title[]。在java中,可以将类型表达式放在一起:String[] title;

    String[] title;
    

    此变量未初始化,为数组对象保留一个内存槽,但内存未填充、初始化;它包含垃圾。在首次使用title时,编译器会发出一个错误。

    相比之下,字段默认自动初始化:此处为null,但对于其他类型的0false0.0

  2. 初始化变量:给它一个初始值。

    对于数组,这意味着设置一个数组对象。阵列是固定长度的,不能增长,因此:

    String[] title;
    title = new String[10];
    

    或更短:

    String[] title = new String[10];
    

    字段一样,数组元素也使用默认值null进行初始化。

    请注意,您已初始化a:int a = 0;

  3. 现在您可以通过变量使用数组对象:

    title[a] = cursor.getString(0);
    

    在这一点上,编译器看到了一个仍然没有值的变量的使用。

因此代码变为:

public String[] loadTitles() {
String[] titles = new String[100];
String sql = "select Title from User_DB";
SQLiteDatabase db = getReadableDatabase();
int a = 0;
try (Cursor cursor = db.rawQuery(sql, null)) {
while (a < titles.length && cursor.moveToNext()) {
titles[a] = cursor.getString(0);
a++;
}
} // Calls cursor.close();
return Arrays.copyOf(titles, a);
}

Array.copyOf(array, newLength)以读取的标题的数目作为新的长度来复制原始阵列。

我添加了(奇怪的(try with resources语法,它确保cursor是关闭的,即使在块内发生异常或返回时也是如此。

相关内容

最新更新