在我的 Android 应用程序中,我发现在大约 0.5% 的尝试中会发生错误。此错误是由 NullPointerException
生成的,但这很奇怪。
下面总结了生成该异常的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
mInfo = intent.getParcelableExtra(EXTRA_MESSAGE_INFO); // mInfo is a private member of Activity
if(mInfo == null)
finish();
setContentView(R.layout.activity_fermata_details);
first = savedInstanceState.getBoolean(IS_FIRST_LOAD, true); // also onSaveInstanceState is used for maintain that value across configuration changes.
if(first){
first = false;
// a new fragment is inflated in the FrameLayout of the Activity
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
DetailsFragment fragment = new DetailsFragment();
transaction.replace(R.id.content_fragment, fragment);
transaction.commit();
}
}
Activity 还有如下公共(public)方法:
public int getIdInfo(){
return mInfo.getId(); // here occurs the NullPointerException.
}
方法 getIdInfo()
以这种方式从 Fragment 中调用:
(MyActivity)getActivity()).getIdInfo();
我认为这是一个奇怪的行为,因为 NullPointerException
告诉 mInfo
应该为 null。但是 onCreate 中的条件:
if(mInfo == null)
finish();
应确保如果 mInfo 为 null,则 Activity 已完成。
哪里会出错?可能与垃圾收集器行为有关?
注意:我无法获得更多关于错误的信息(该错误在 600 次尝试中被检测到 3 次),因为我已经检索到此异常表单 Google Analytics
,这给了我这一行:
NullPointerException (@MyActivity:getIdInfo:122) {main}
最佳答案
我认为您得到的是未完全创建的 Activity:一个已检测到 null 并调用了 finish() 的 Activity。请考虑 finish()
不会导致 onCreate()
方法停止这一事实。
我建议:
mInfo = intent.getParcelableExtra(EXTRA_MESSAGE_INFO);
if(mInfo == null) {
finish();
return;
}
有人可能会怀疑 FragmentManager 不会尝试将任何 fragment 附加到对自身调用 finish() 的 Activity ,但我无法找到该行为的任何文档。
关于java - Activity 内部出现奇怪的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27411313/