Java 活动内奇怪的NullPointerException

Java 活动内奇怪的NullPointerException,java,android,android-fragments,nullpointerexception,garbage-collection,Java,Android,Android Fragments,Nullpointerexception,Garbage Collection,在我的Android应用程序中,我发现大约0.5%的尝试都会发生错误。此错误是由NullPointerException生成的,但这很奇怪 下面总结了生成该异常的代码: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); mInfo = intent.getParcelableExtra

在我的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();
    }
}
该活动还具有以下公共方法:

public int getIdInfo(){
    return mInfo.getId(); // here occurs the NullPointerException.
}
方法
getIdInfo()
通过以下方式从片段中调用:

(MyActivity)getActivity()).getIdInfo();
我认为这是一种奇怪的行为,因为
NullPointerException
告诉
mInfo
应该为null。但是onCreate中的条件:

if(mInfo == null)
    finish();
应确保如果mInfo为null,则活动已完成

错误在哪里?是否可能与垃圾收集器行为有关

注意:我无法获得有关错误的更多信息(错误在600次尝试中被检测到3次),因为我检索到了此异常表单
谷歌分析
,仅此一行:

NullPointerException (@MyActivity:getIdInfo:122) {main}

我认为您得到的不是完全创建的活动:一个检测到null并调用finish()的活动。请考虑“<代码> FIX())/>代码>不会导致<代码> OnCeCuto()/Case>方法停止。

我建议:

mInfo = intent.getParcelableExtra(EXTRA_MESSAGE_INFO);
if(mInfo == null) {
     finish();
     return;
}

有人可能会怀疑FragmentManager不会尝试将任何片段附加到自己调用finish()的活动,但我找不到任何关于该行为的文档

我在任何地方都看不到savedInstanceState.setBoolean(是第一次加载还是第一次加载)?为了避免在我的问题中编写大量代码,我省略了它。但正如在评论中所说,我在onSaveInstanceState()回调中使用了它,何时调用(MyActivity)getActivity()).getIdInfo();在片段中?因为它需要访问该信息。片段使用该信息调用ws。ws在任务内被调用崩溃,则
getActivity
为空。你把它称为碎片分离的地方,我想你是对的。使用返回可以确保后续代码不会被执行吗?