2012-03-09 19 views
0

が発生し、私は私のプロジェクトで使用する新しいクラスを定義していると私はここでのコンテキストでopenOrCreateDatabaseがnullポインタ例外

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

完全なlogcatを追加.......... –

答えて

0

あなたは」実際にはContextが有効であることを確認してから使用してください。例えば

OurClass(dhaService dhx)nullContextで呼び出された場合sContextが有効な値についてはdhxまたはsContextのいずれかを確認せずdhxの値が割り当てられているため、その後、putDefaultValueNullPointerExceptionで失敗します。サイドノートでは

、どちら sContext、また mContextは、実際にはコンストラクタのいずれかを呼ばなかった決してしながら、あなたが今持っている適切なチェックの欠如と、あなたは簡単に不注意、 put_default_valueを呼び出すことができることを意味し、初期化されています。これはベストプラクティスではありません。


EDIT:このに対してガードを助けるために

一つの方法は、クラスのインスタンスは、あなたが提供したコンストラクタのいずれかを呼び出すことによって作成されなければならないように、デフォルトのコンストラクタをプライベートにすることです。

private: 
    OurClass (void) { 
    } 

あなたは、あなたはまだ適切に少なくともヌルポインタを検出するために、あなたの入力を検証する必要があることを行う場合であっても - あなたはそれを明確に今はないので、それはすべての作業あなたは、意図しますと仮定することはできません。