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



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

这是我编码的:

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");
        }

在使用Context之前,实际上并没有检查它们是否有效。

例如,如果用null Context调用OurClass(dhaService dhx),则putDefaultValue将用NullPointerException失败,因为sContext被分配了dhx的值,而没有检查dhxsContext的有效值。

顺便说一句,sContextmContext都没有初始化,这意味着由于目前缺乏正确的检查,您很容易在无意中调用put_default_value,而实际上从未调用过任何一个构造函数。这不是最佳做法。


编辑:

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

private:
    OurClass ( void ) {
    }

即使你这样做了,你仍然需要正确验证你的输入,以至少检测到空指针——你不能只是假设它会按照你的意愿工作,因为现在显然不是这样。

最新更新