类抛出空指针异常

时间:2015-02-05 09:28:08

标签: android

为什么以下方法会抛出NPE,

public ActivityOne extends Activity{
   DataManager dtMan = new DataManager(this)

   public onCreate (){ 
    ...some source code here...
    dtMan.check();
   }
}

public class DataManager(){
   private Context myContext;

   public DataManager (Context context){
     myContext = context;
   }

   Helper helper = new Helper(this);

   public boolean check(){
     helper.open();
     ...some source code here...
   }
}

当我查看logcat时;我得到一个java.null.pointer异常,所以我做了类似

的事情
public class DataManager(){
   private Context myContext;

   public DataManager (Context context){
     myContext = context;
   }

   public boolean check(Context context){
     **Helper helper = new Helper(context);**
     helper.open();
     ...some source code here...
   }
}

并且它有效,所以在Java / Android编程透视图中两个DataManager之间有什么区别,因此如果我理解正确,这种方法必须复制到如下:

public class DataManager(){
   private Context myContext;

   public DataManager (Context context){
     myContext = context;
   }

   public boolean check(Context context){
     **Helper helper = new Helper(context);**
     helper.open();
     ...some source code here...
   }

   public boolean check2(Context context){
     **Helper helper = new Helper(context);**
     helper.open();
     ...some source code here...
   }

   public boolean check3(Context context){
     **Helper helper = new Helper(context);**
     helper.open();
     ...some source code here...
   }
}

意思是我不能一次声明Helper Class并在调用类的任何地方使用它,我是否忘记了一些基本原理?请澄清。

上下文是否也会导致内存泄漏?如果是这样,我将如何解决?

@EDIT:

好吧,我忘了包括助手班

public class Helper {      private Context myContext;

 public Helper(Context context){
    myContext = context;
 }

 public void open(){
  //do stuff here
 }

}

2 个答案:

答案 0 :(得分:1)

您的代码不起作用,因为DataManager在Activity中的字段范围初始化。

需要Context的类应该始终在Activity的一个生命周期方法中初始化:

onCreate,onStart,onDestroy等

像这样:

private DataManager dataManager;

public void on create(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    dataManager = new DataManager(this):
}

您还应该在DataManager构造函数中初始化Helper类:

public class DataManager(){
    private Context context;
    private Helper helper;

    public DataManager (Context context){
        this.context = context;
        this.helper = new Helper(this.context);
     }

    public boolean check(Context context){
        helper.open();
        //...some source code here...
    }
}

为防止内存泄漏,您只需确保DataManager类不是具有活动上下文的静态实例。

如果您不需要活动上下文,但您也应该使用应用程序上下文,那么您应该使用它:

public DataManager(Context context){
    this.context = context.getApplicationContext();
    //...
}

答案 1 :(得分:0)

试试

  

dtMan = new DataManager(this)

在Activity中的onCreate方法中?