在Activity里面有奇怪的NullPointerException

时间:2014-12-10 21:38:35

标签: 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(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.
}

以这种方式从Fragment调用方法getIdInfo()

(MyActivity)getActivity()).getIdInfo();

我认为这是一种奇怪的行为,因为NullPointerException告诉mInfo应该为空。但是onCreate中的条件:

if(mInfo == null)
    finish();

应该确保如果mInfo为null,则Activity完成。

哪里可以出错?可以与垃圾收集器行为有关吗?

注意:我无法获得有关错误的更多信息(错误在600次尝试中被检测到3次),因为我已检索到Google Analytics这种异常形式,这给了我这一行:

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

1 个答案:

答案 0 :(得分:3)

我认为你没有完全创建Activity:一个检测到null并调用finish()。请考虑finish()不会导致onCreate()方法停止的事实。

我建议:

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

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