获取 "Variable might not initialized error"

Getting "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;
    

    这个变量未初始化,为一个数组object预留了一个内存槽,但是内存没有被填满,初始化;它包含垃圾。在第一次使用 title 时,编译器会发出错误。

    相反class字段默认自动初始化:这里null,但对于其他类型0false0.0 等等。

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

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

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

    或更短:

     String[] title = new String[10];
    

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

    请注意您已初始化 aint a = 0;

  3. 现在可以通过变量使用数组object:

           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 关闭,即使在异常或内部发生 return 时也是如此街区。