Android 从主屏幕启动时intent.getStringExtra上的NPE

Android 从主屏幕启动时intent.getStringExtra上的NPE,android,Android,在运行Android 5.0及以上版本的某些设备上,当我的应用程序从主屏幕打开并显示以下消息时,它将崩溃: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference at com.imincode.menitiplus.MainActivity.loadSelected

在运行Android 5.0及以上版本的某些设备上,当我的应用程序从主屏幕打开并显示以下消息时,它将崩溃:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at com.imincode.menitiplus.MainActivity.loadSelectedIntent(MainActivity.java:229)
at com.imincode.menitiplus.MainActivity.onNewIntent(MainActivity.java:213)
at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1233)
at android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2462)
at android.app.ActivityThread.performNewIntents(ActivityThread.java:2475)
at android.app.ActivityThread.handleNewIntent(ActivityThread.java:2484)
at android.app.ActivityThread.access$1600(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
这是导致错误的代码

private void loadSelectedIntent(Intent intent){
        if ((intent != null) && (intent.getExtras() != null)){
            Fragment fragment = null;
            FragmentManager fManager = this.getSupportFragmentManager();
            FragmentTransaction transaction = fManager.beginTransaction();
            Bundle bundle;
            if (intent.getStringExtra("intentCaller").equals("expensesRecurring")){
                fragment = new MenuNotifications();
                bundle = new Bundle();
                bundle.putString("tab", "0");
                fragment.setArguments(bundle);
                transaction.replace(R.id.container, fragment, "fragmentMenuNotifications");
                transaction.addToBackStack(null);
                transaction.commit();
            }else if (intent.getStringExtra("intentCaller").equals("creditCard")){
                fragment = new MenuNotifications();
                bundle = new Bundle();
                bundle.putString("tab", "1");
                fragment.setArguments(bundle);
                transaction.replace(R.id.container, fragment, "fragmentMenuNotifications");
                transaction.addToBackStack(null);
                transaction.commit();
            }else if (intent.getStringExtra("intentCaller").equals("locationAlert")){
                fragment = new MenuNotifications();
                bundle = new Bundle();
                bundle.putString("tab", "2");
                fragment.setArguments(bundle);
                transaction.replace(R.id.container, fragment, "fragmentLocationAlert");
                transaction.addToBackStack(null);
                transaction.commit();
            }

        }
    }
具体来说,抛出错误的行是

if (intent.getStringExtra("intentCaller").equals("expensesRecurring"))
loadSelectedIntent将从MainActivity中的两个位置调用。 第一个:

@Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        loadSelectedIntent(intent);
    }
第二个:

@Override
    protected void onResume() {
        super.onResume();
        Intent isThereAnyIntentHere = getIntent();
        if ((isThereAnyIntentHere != null) && (isThereAnyIntentHere.getExtras() != null)){
            loadSelectedIntent(isThereAnyIntentHere);
        }
    }
请注意,此错误仅在用户试图通过单击主屏幕上的应用程序图标来启动应用程序时才会出现。如果用户在Play Store中单击“打开应用程序”,则可以毫无问题地启动该应用程序

为什么此错误仅在选定设备上发生,并且仅在从主屏幕启动时发生

我想把代码

if ((intent != null) && (intent.getExtras() != null))
if ((intent != null) && (intent.getExtras() != null))
它肯定会确保intent.getStringExtra不为null

我想把代码

if ((intent != null) && (intent.getExtras() != null))
if ((intent != null) && (intent.getExtras() != null))
它肯定会确保intent.getStringExtra不为null

不,您知道extras捆绑包不是空的,但是您还没有确定特定的密钥是否存在

因此,我们知道,如果没有任何附加项,它将返回null

我想把代码

if ((intent != null) && (intent.getExtras() != null))
if ((intent != null) && (intent.getExtras() != null))
它肯定会确保intent.getStringExtra不为null

不,您知道extras捆绑包不是空的,但是您还没有确定特定的密钥是否存在

因此,我们知道,如果没有任何附加项,它将返回null

我想把代码

if ((intent != null) && (intent.getExtras() != null))
if ((intent != null) && (intent.getExtras() != null))
它肯定会确保intent.getStringExtra不为null

不,您知道extras捆绑包不是空的,但是您还没有确定特定的密钥是否存在

因此,我们知道,如果没有任何附加项,它将返回null

我想把代码

if ((intent != null) && (intent.getExtras() != null))
if ((intent != null) && (intent.getExtras() != null))
它肯定会确保intent.getStringExtra不为null

不,您知道extras捆绑包不是空的,但是您还没有确定特定的密钥是否存在


因此,从中我们知道,如果没有任何附加项,它将返回null。

intent.getExtras()!=null
仅保证在您的意图中有某种额外的内容,但这不仅限于您设置的额外内容。发射意图可能包含任何内容

问题是,如果找不到您试图查找的额外名称,则可能返回
null
。一个快速而肮脏的解决方案是将
if
语句颠倒如下:

if ("expensesRecurring".equals(intent.getStringExtra("intentCaller")))
您还可以检查多余的内容是否为空,然后按照以下方式使用:

if (intent.getStringExtra("intentCaller") != null && intent.getStringExtra("intentCaller").equals("expensesRecurring"))

intent.getExtras()!=null
仅保证在您的意图中有某种额外的内容,但这不仅限于您设置的额外内容。发射意图可能包含任何内容

问题是,如果找不到您试图查找的额外名称,则可能返回
null
。一个快速而肮脏的解决方案是将
if
语句颠倒如下:

if ("expensesRecurring".equals(intent.getStringExtra("intentCaller")))
您还可以检查多余的内容是否为空,然后按照以下方式使用:

if (intent.getStringExtra("intentCaller") != null && intent.getStringExtra("intentCaller").equals("expensesRecurring"))

intent.getExtras()!=null
仅保证在您的意图中有某种额外的内容,但这不仅限于您设置的额外内容。发射意图可能包含任何内容

问题是,如果找不到您试图查找的额外名称,则可能返回
null
。一个快速而肮脏的解决方案是将
if
语句颠倒如下:

if ("expensesRecurring".equals(intent.getStringExtra("intentCaller")))
您还可以检查多余的内容是否为空,然后按照以下方式使用:

if (intent.getStringExtra("intentCaller") != null && intent.getStringExtra("intentCaller").equals("expensesRecurring"))

intent.getExtras()!=null
仅保证在您的意图中有某种额外的内容,但这不仅限于您设置的额外内容。发射意图可能包含任何内容

问题是,如果找不到您试图查找的额外名称,则可能返回
null
。一个快速而肮脏的解决方案是将
if
语句颠倒如下:

if ("expensesRecurring".equals(intent.getStringExtra("intentCaller")))
您还可以检查多余的内容是否为空,然后按照以下方式使用:

if (intent.getStringExtra("intentCaller") != null && intent.getStringExtra("intentCaller").equals("expensesRecurring"))

我没有按照您建议的那样做,而是进一步将其放在上面,使其成为if((intent!=null)&&(intent.getExtras()!=null)&&(intent.getStringExtra(“intentCaller”)!=null)。应该没问题吧?现在无法测试它。我需要先把我的手放在抛出这个错误的电话上。另一个重要的问题是。。。为什么只有5%的手机会出现这种情况?另外95%的用户在工作时从未抛出过这个错误。也许android的某些版本会在那里添加一些额外的错误?我在我的应用程序中遇到了一些虚假的意图,因此我开始做额外的检查。无论如何,我恐怕没有足够的知识来回答这个问题。我没有按照你的建议去做,而是把它放得更远,如果((intent!=null)&&&(intent.getExtras()!=null)&&(intent.getStringExtra(“intentCaller”)!=null))。应该没问题吧?现在无法测试它。我需要先把我的手放在抛出这个错误的电话上。另一个重要的问题是。。。为什么只有5%的手机会出现这种情况?另外95%的用户在工作时从未抛出过这个错误。也许android的某些版本会在那里添加一些额外的错误?我在我的应用程序中遇到了一些虚假的意图,因此我开始做额外的检查。无论如何,我恐怕没有足够的知识来回答这个问题。我没有按照你的建议去做,而是把它放得更远,如果((intent!=null)&&&(intent.getExtras()!=null)&&(intent.getStringExtra(“intentCaller”)!=null))。应该没问题吧?现在无法测试它。我需要先把我的手放在抛出这个错误的电话上。另一个重要的问题是。。。为什么只有5%的手机会出现这种情况?另外95%的用户在工作时从未抛出过这个错误。也许android的某些版本会在那里添加一些额外的错误?我在我的应用程序中遇到了一些虚假的意图,因此我开始做额外的检查。安尼