我还在学习Java,但我不确定为什么会导致编译时错误:
public class AnswerRepository implements IAnswerRepository
{
private final static SQLiteDatabase database;
public AnswerRepository(Activity activity)
{
if(database != null)
{
database = DbOpenHelper.getInstance(activity);
}
}
}
我只是想在为其分配值之前检查是否先分配了最终变量。但似乎编译时检查不喜欢它。那是为什么?
答案 0 :(得分:7)
final
个变量只能初始化一次。通常,它们必须在构造函数中初始化,但如果它们是static
,则在定义它们时需要对它们进行初始化,如下所示:
private final static SQLiteDatabase database = new SQLiteDatabase(...);
或者,您可以稍后对其进行初始化:
private static SQLiteDatabase database;
static
变量将在调用对象构造函数之前初始化。因此,在这种情况下,database
始终为null
,因为它是null
,在对象构造函数中重新初始化将导致编译时错误。
答案 1 :(得分:2)
您无法在构造函数上初始化final static
变量。要初始化使用内联语句,
private final static SQLiteDatabase database= DbOpenHelper.getInstance(activity);
或使用静态阻止。
private final static SQLiteDatabase database;
static{
database = DbOpenHelper.getInstance(activity);
}
答案 2 :(得分:1)
初始化数据库变量。
private final static SQLiteDatabase database = null;
仅供参考:您应该在静态初始化程序中或直接初始化静态最终变量。所以要么
static final SQLiteDatabase database = null;
或者
static final JButton button;
static {
button = new JButton();
}
请阅读此doc了解详情。
答案 3 :(得分:1)
此时:
if (database != null)
不可能 database
具有非空值:您没有在声明处初始化它,也没有在任何静态初始化块初始化它。因此编译器正在抱怨此时变量为null
。
在声明中初始化它:
private final static SQLiteDatabase database = ...;
或者使用静态初始化块:
static {
database = ...;
}
答案 4 :(得分:1)
必须以静态方式初始化最终静态成员。在你的情况下。您需要删除final关键字。
答案 5 :(得分:1)
静态变量属于Class,不属于该类的任何实例。它们将在课程加载时间初始化。因此,在构造函数中初始化它没有任何意义。因为每次创建实例,都会重新初始化。这可能会给您带来麻烦。使用静态初始化块初始化它们。
答案 6 :(得分:1)
最终变量最初为null且为&然后,当它有参考,那么它不会改变。 所以你必须把
database = null;
否则你必须在if条件下指定一些值。
所以如果if
没有执行,那么它也必须分配值。
答案 7 :(得分:1)
静态成员必须在
中初始化静态 { }
块
答案 8 :(得分:0)
由于您正在尝试在AnswerRepository构造函数中创建数据库变量的实例,因此我认为没有必要在构造函数中进行空检查。
这应该在DbOpenHelper.getInstance(activity)中处理,而不是在这里。
您的代码可以如下所示,并且可以满足您的目的。
public class DbOpenHelper
{
private static SQLiteDatabase database;
public static SQLiteDatabase getInstance(Activity activity)
{
if( null == database )
{
database = new SQLiteDatabase(...);
}
return database;
}
}
创建单身人士有很多好方法。选择一个好的。上面发布的那个只是一个例子。
正如其他人所说,但下面的代码是静态块
database = DbOpenHelper.getInstance(activity);