我有一个活动 - 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()中具有相同的行为。
我会感激任何提示。
编辑:
答案 0 :(得分:1)
我需要道歉,我发现问题是由我们的代码引起的。从某些版本我们添加了互联网连接检查onCreate()方法,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!isInternetConnectionPresent()) {
return;
}
mySvc = DI.i().getMySvc();
...
}
因此,如果用户离线,他们就会获得NPE,因为变量从未被初始化,但是调用onStop()。 我认为根本原因是错误处理的错误方法。我想要实现的是能够从活动中抛出异常,并拥有通用处理程序,它们能够处理这些异常。 所以在这种情况下,我会抛出NoInternetConnectionException,处理程序会向用户显示一个有意义的对话框。 另外我想知道在抛出异常时是否会调用其他生命周期方法。
答案 1 :(得分:-1)
根据MySvc
的不同,android VM可能会根据需要选择GC。 android的最佳方法是首先检查null,如果需要再次实例化它,然后做你想要的。一直适用于我,没有性能问题。