不同类中的openOrCreateDatabase导致空指针异常

时间:2012-03-09 12:42:27

标签: android class

我已经定义了一个在我的项目中使用的新类,我在上下文中得到了空指针异常

这是我编码的内容:

public class OurClass extends Activity {
     private dha mContext;
     private dhaService sContext; 


     public OurClass(dha dha) {
          sContext=null;
           mContext = dha;
        }

     public OurClass(dhaService dhx) {
            sContext = dhx;
            mContext=null;
        }
    public  void put_default_value( String varname, String value) {
        Log.i("dha",     "d1");
        SQLiteDatabase db;
        Log.i("dha",     "d1.5");
        if (mContext==null) {
            Log.i("dha",     "dx1");
         db = sContext.openOrCreateDatabase("gipi.db", SQLiteDatabase.CREATE_IF_NECESSARY,null);
         Log.i("dha",    "dx2");
        } else {
            Log.i("dha",     "dz1");
        db = android.database.sqlite.SQLiteDatabase.openOrCreateDatabase("gipi.db", null);
        Log.i("dha",     "dz2");
        }

1 个答案:

答案 0 :(得分:0)

在使用Context之前,您实际上并未检查OurClass(dhaService dhx)是否有效。

例如,如果使用null Context调用putDefaultValue,则NullPointerException会因sContext而失败,因为dhx已分配dhx的值,而不检查sContextsContext的有效值。

在旁注中,mContextput_default_value都没有被初始化,这意味着由于您现在没有进行适当的检查,您可能很容易无意中拨打private: OurClass ( void ) { } ,而从未实际调用任何一个构造函数。这不是最佳做法。


编辑:

防止这种情况的一种方法是将默认构造函数设为私有,以便通过调用您提供的构造函数来创建类的实例

{{1}}

即使你这样做,你仍然需要正确验证你的输入以至少检测空指针 - 你不能只是假设它将按你的意图一直工作,因为它显然不是现在。