Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:成员变量变为null_Android_Android Activity_Nullpointerexception_Instance Variables_Android Lifecycle - Fatal编程技术网

Android:成员变量变为null

Android:成员变量变为null,android,android-activity,nullpointerexception,instance-variables,android-lifecycle,Android,Android Activity,Nullpointerexception,Instance Variables,Android Lifecycle,我有一个activity-MainActivity,在这里我在onCreate(…)方法中初始化成员变量。然后在onStart()和onStop()方法中使用此变量 很简单吧?现在的问题是,从我的用户那里,我开始得到NullPointerException崩溃报告,这发生在onStop()方法中 我一直在广泛地寻找原因,我知道当android决定释放内存时,静态变量可能会变为null,但是我找不到成员变量的情况,该变量在onCreate()中初始化。 代码如下: public class Mai

我有一个activity-MainActivity,在这里我在onCreate(…)方法中初始化成员变量。然后在onStart()和onStop()方法中使用此变量

很简单吧?现在的问题是,从我的用户那里,我开始得到NullPointerException崩溃报告,这发生在onStop()方法中

我一直在广泛地寻找原因,我知道当android决定释放内存时,静态变量可能会变为null,但是我找不到成员变量的情况,该变量在onCreate()中初始化。 代码如下:

public class MainActivity extends ActionBarActivity implements ActionBar.TabListener, SharedPreferences.OnSharedPreferenceChangeListener {
private MySvc mySvc;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);     
    mySvc = DI.i().getMySvc();
    ...
}

@Override
protected void onStart() {
    super.onStart();
    mySvc.start();
}

...

@Override
protected void onStop() {
    super.onStop();
    //here I get NPE
    mySvc.stop();
}
}
}

为了让事情变得更加神秘,我开始只从某些版本的应用程序中获取此崩溃报告,但是旧版本在onStart()和onStop()中具有相同的行为

如有任何提示,我将不胜感激

编辑:

  • DI.i().getMySvc();从不返回null,它是根据单例模式完成的
  • MySvc是一个POJO,在DI类中实例化

根据MySvc是什么,android虚拟机可以根据需要选择GC。使用android的最佳方法是首先检查null,如果需要再次实例化它,然后做你想做的事情。我一直在工作,没有性能问题。

我需要道歉,我发现问题是由我们的代码引起的。在某些版本中,我们向onCreate()方法添加了internet连接检查,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);     
    if (!isInternetConnectionPresent()) {
        return;
    }
    mySvc = DI.i().getMySvc();
...
}
因此,如果用户处于脱机状态,他们将获得NPE,因为变量从未初始化,但调用了onStop()。 我认为根本原因是错误的错误处理方法。我想要实现的是能够从活动中抛出异常,并拥有能够处理这些异常的通用处理程序。 因此,在本例中,我将抛出NoInternetConnectionException,处理程序将向用户显示一个有意义的对话框。
另外,我想知道在抛出异常时是否调用了其他生命周期方法。

检查一下,我想这就是您要搜索的内容。
DI.I().getMySvc()是否可能
返回
null
?@subsider该链接如何应用于此问题?检查
mySvc=DI.i().getMySvc()不为null。DI.i().getMySvc()从不返回null。我在问题中犯了一个错误,我在onStop()中得到NPE,而不是在onStart()中。在onStart()中,一切都像一个符咒一样工作。VM将只使用GC无法访问的对象。如果存在可以访问的引用,VM将不会GC对象。VM当然不会在我们的代码中将引用随机设置为
null
。我已经临时修复了onStop()方法中的:DI.I().getMySvc().stop()的问题。但是,我不能在实例变量为空的情况下计数!?是的,这是真的,我知道。但是查询代码中的调用是DI.i().getMySvc();我当然不知道那是什么意思。所以代码学徒如果还不知道的话请取消否决票。我清楚地说“取决于MySvc是什么”