Java 引用子类静态成员的父类引发ExceptionInInitializeError
更新的问题: 我可以设计一个父类来访问子类静态成员而不抛出错误吗?如果这是可能的,我们该怎么做呢Java 引用子类静态成员的父类引发ExceptionInInitializeError,java,android,sqlite,Java,Android,Sqlite,更新的问题: 我可以设计一个父类来访问子类静态成员而不抛出错误吗?如果这是可能的,我们该怎么做呢 基本上,我有一个DbHelper类,它扩展了SQLiteOpenHelper。我还实现了所需的必要方法 public class DbHelper extends SQLiteOpenHelper { public static final String DATABASE_NAME = "MyDb.sqlite3"; public static final int DATABASE_VER
基本上,我有一个DbHelper类,它扩展了SQLiteOpenHelper。我还实现了所需的必要方法
public class DbHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "MyDb.sqlite3";
public static final int DATABASE_VERSION = 1;
public static final String CREATE_TABLE_FOO = "CREATE TABLE " + FooAdapter.TABLE_NAME
+ " (" + FooAdapter.COLUMN_BAR + " INTEGER PRIMARY KEY)";
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_FOO);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// do nothing
}
}
然后我将这个类扩展为一个更具体的子类FooAdapter
public class FooAdapter extends DbHelper {
public static String TABLE_NAME = "foo";
public static String COLUMN_BAR = "bar";
public FooAdapter(Context context) {
super(context);
}
// table specific methods, select, insert, delete
}
在注释的帮助下,我发现错误是因为DbHelper正在访问FooAdapter的静态成员,而FooAdapter是DbHelper的子类
因此,如果我在活动中实例化FooAdapter,我会得到ExceptionInInitializerError
FooAdapter fooDb = new FooAdapter(this); // throws ExceptionInInitializerError
但是如果我先实例化DbHelper,那么一切都会正常运行
DbHelper dbHelper = new DbHelper(this);
FooAdapter fooDb = new FooAdapter(this); // no error
我检查了logcat,最后一行错误显示为
DbHelper.(DbHelper.java…
clinit
指的是类初始化,例如静态变量或静态初始化程序块。但是,您发布的代码在这方面没有显示问题。可能是因为我在扩展类中引用了扩展类的静态成员,而它变成了循环?我将首先尝试消除这些静态。stacktrace显示了问题所在的特定行。是的,我设法找到了问题的根源,它与android或sqlite完全无关。我想我必须重新定义我的类,这样子类中的静态成员就不会被父类引用。我编辑了这个问题以反映真实的问题。