我正在为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[]没有初始化,但我不明白为什么。我清楚地初始化了它。
-
您声明
title
。允许的C语言样式为String title[]
。在java中,可以将类型表达式放在一起:String[] title;
String[] title;
此变量未初始化,为数组对象保留一个内存槽,但内存未填充、初始化;它包含垃圾。在首次使用
title
时,编译器会发出一个错误。相比之下,字段默认自动初始化:此处为
null
,但对于其他类型的0
、false
、0.0
等 -
初始化变量:给它一个初始值。
对于数组,这意味着设置一个数组对象。阵列是固定长度的,不能增长,因此:
String[] title; title = new String[10];
或更短:
String[] title = new String[10];
与字段一样,数组元素也使用默认值
null
进行初始化。请注意,您已初始化
a
:int a = 0;
。 -
现在您可以通过变量使用数组对象:
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
是关闭的,即使在块内发生异常或返回时也是如此。