2012-03-09 28 views
0

我已經定義了一個新的類空指針在我的項目中使用,我得到空指針異常的背景下openOrCreateDatabase在不同的類導致的異常

這裏是我的編碼:

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

添加完整的logcat .......... – 2012-03-09 12:53:49

回答

0

你」在使用它們之前並沒有真正檢查Context是否有效。

例如,如果OurClass(dhaService dhx)是帶一個nullContext,然後putDefaultValue將失敗,因爲NullPointerExceptionsContext被分配的dhx值而不檢查任一dhxsContext爲有效值。

在一個側面說明,無論sContext,也不mContext正在初始化,這意味着與缺乏你現在適當的檢查的,你可以很容易在不經意間叫put_default_value,而實際上從未已經或者叫做構造器。這不是最佳實踐。


編輯:

的一種方式,以幫助防止這是使默認的構造函數私有,使類的實例必須致電您所提供的構造函數之一創建:

private: 
    OurClass (void) { 
    } 

即使你這樣做,你仍然需要正確驗證您的輸入至少檢測空指針 - 你不能想當然地認爲它會作爲一切工作的打算,因爲它顯然不是現在。

相關問題