java - Activity 内部出现奇怪的 NullPointerException

标签 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();
    }
}

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/

相关文章:

java - 通过 gradle 为 spring boot 应用构建 docker 镜像时的最佳实践

android - viewpager 中的 fragment savedinstancestate 始终为 null

java - 弹出返回堆栈时 fragment 会被销毁吗?

java - Android 在另一个 fragment 中显示 2 个 fragment

java - 如何为android中的字符串输入生成唯一的哈希码...?

java - NoClassDefFoundError : javax. xml.bind.DatatypeConverter

android - 如何在 Android Studio 中以相反的顺序显示 git 日志历史记录?

Android ViewPager : Update off-screen but cached fragments in ViewPager

java - 如何禁用 JPanel 中的所有组件

android - 如何将 SD 卡中的多张图片附加到电子邮件中?