【问题标题】:Android Null Pointer Exception when Creating Database创建数据库时Android空指针异常
【发布时间】:2013-03-05 11:04:49
【问题描述】:

我有一个示例应用程序,它创建一个数据库、表并插入一行值。

这是我的MainActivity.java

public class MainActivity extends Activity {

protected static final android.content.Context Context = null;
public String ReadingMode="";

@Override
protected void onCreate(Bundle savedInstanceState) {


             SQLiteDatabase sampleDB =  Context.openOrCreateDatabase("WaterElectricityReading", MODE_WORLD_READABLE, null);

             sampleDB.execSQL("CREATE TABLE IF NOT EXISTS " +
                        "SampleTable " +
                        " (LastName VARCHAR, FirstName VARCHAR," +
                        " Country VARCHAR, Age INT(3));");

             sampleDB.execSQL("INSERT INTO " +
                        "SampleTable " +
                        " Values ('Makam','sample','India',25);");

             sampleDB.close();                       
        }


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

}

当我逐行调试时,Null pointer exception 在该行附近出现:

 SQLiteDatabase sampleDB =  Context.openOrCreateDatabase("WaterElectricityReading", MODE_WORLD_READABLE, null); 

我看到 sampleDB 为 null 并且 Database 没有被创建。

我的代码有什么问题吗?

【问题讨论】:

    标签: android nullpointerexception sqlite


    【解决方案1】:

    你正在用 null 初始化你的上下文

    protected static final android.content.Context Context = null;
    

    所以当你使用你的 null Context 时,它会抛出一个 NPE,你可以用你的 Activity Context 设置你的 Context 然后使用你的 Context

    Context = MainActivity.this;
    

    或者直接使用这个

    SQLiteDatabase sampleDB =  this.openOrCreateDatabase("WaterElectricityReading", MODE_WORLD_READABLE, null);
    

    【讨论】:

      【解决方案2】:

      您正在初始化为protected static final android.content.Context Context = null; 然后将其用作Context.openOrCreateDatabase("WaterElectricityReading", MODE_WORLD_READABLE, null);

      明显会产生空指针异常。

      【讨论】:

        【解决方案3】:

        替换

          SQLiteDatabase sampleDB =  Context.openOrCreateDatabase("WaterElectricityReading", MODE_WORLD_READABLE, null);
        

          SQLiteDatabase sampleDB =  this.openOrCreateDatabase("WaterElectricityReading", MODE_WORLD_READABLE, null);
        

        原因:

        1. ActivityContext 的子类,因此您可以使用 this
        2. openOrCreateDatabase 不是静态方法,因此不能使用类名调用它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多