【问题标题】:App Crashes on Splash Screen throwing Null Pointer启动屏幕上的应用程序崩溃并抛出空指针
【发布时间】:2017-07-31 22:08:33
【问题描述】:

根据 Playstore ANR & Crashes 的说法,该应用在 SplashScreen oncreate 上抛出空指针。我检查了功能,它看起来很好。并非所有手机都会崩溃。

我的 SplashActivity.java

package com.example.app;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;

public class SplashActivity extends AppCompatActivity {

    String path = "";
    String banner = "";
    String title = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        if(getIntent().getExtras() != null){
            Log.e("splash", "from push link");
            path = getIntent().getExtras().getString("link");
            banner = getIntent().getExtras().getString("bannerImage");
            title = getIntent().getExtras().getString("title");
            String link = String.valueOf(Html.fromHtml(Html.fromHtml(path).toString()));
            String imgurl = String.valueOf(Html.fromHtml(Html.fromHtml(banner).toString()));
            Log.e("link----", "link--" + link);

            SharedPreferences pref = getApplicationContext().getSharedPreferences("Push", MODE_PRIVATE);
            SharedPreferences.Editor editor = pref.edit();
            String pushtitle = pref.getString("pushtitle", "");

            StringBuilder sb = new StringBuilder();
            sb.append(pushtitle).append(title).append(",");
            Log.e("pushtitle===========", sb.toString());
            editor.putString("pushtitle", sb.toString());

            String links = pref.getString("link", "");
            StringBuilder sb2 = new StringBuilder();
            sb2.append(links).append(link).append(",");
            Log.e("link===========", sb2.toString());
            editor.putString("link", sb2.toString());

            String imgurlstr = pref.getString("imgurl", "");
            StringBuilder sb3 = new StringBuilder();
            sb3.append(imgurlstr).append(imgurl).append(",");
            Log.e("imgurl===========", sb3.toString());
            editor.putString("imgurl", sb3.toString());

            editor.commit();
        }
        int secondsDelayed = 1;
        new Handler().postDelayed(new Runnable() {
            public void run() {
                Intent intent = new Intent(SplashActivity.this, MainActivity.class);
                if (path  != "") {
                    Log.e("splash", "path==" + path);
                    intent.putExtra("link", String.valueOf(Html.fromHtml(Html.fromHtml(path).toString())));
                }
                startActivity(intent);
                finish();
            }
        }, secondsDelayed * 1000);
    }
}

Playstore 崩溃报告如下。 java.lang.NullPointerException com.example.app.SplashActivity.onCreate

java.lang.RuntimeException:在 android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2984) 在 android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3045) 在 android.app.ActivityThread.-wrap14 (ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage (ActivityThread.java:1642) 在 android.os.Handler.dispatchMessage (Handler.java:102) 在 android.os.Looper.loop (Looper.java:154) 在 android.app.ActivityThread.main (ActivityThread.java:6776) 在 java.lang.reflect.Method.invoke(本机方法)在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1496) 在 com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1386) 引起:java.lang.NullPointerException:
在 java.io.StringReader。 (StringReader.java:50) 在 android.text.HtmlToSpannedConverter.convert (Html.java:758) 在 android.text.Html.fromHtml (Html.java:245) 在 android.text.Html.fromHtml (Html.java:188) 在 com.example.app.SplashActivity.onCreate (SplashActivity.java:27)
在 android.app.Activity.performCreate (Activity.java:6955) 在 android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1126) 在 android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2927

编辑:调试应用程序我收到以下错误:

会话开始后将出现日志消息...

I/art (3818):没有后期启用 -Xcheck:jni(已经启用)W/art
(3818):使用默认值的 X86 的意外 CPU 变体:x86 W/系统 (3818):类加载器引用了未知路径: /data/app/com.example.app-1/lib/x86 D/FirebaseApp(3818): com.google.firebase.auth.FirebaseAuth 未链接。跳过 初始化。 W/InstanceID/Rpc(3818):找到 10012 D/FirebaseApp( 3818):com.google.firebase.crash.FirebaseCrash 未链接。跳过 初始化。 I/FA (3818):应用测量正在启动, 版本:10084 I/FA(3818):启用调试日志运行:adb shell setprop log.tag.FA VERBOSE I/FA (3818):启用更快 调试模式事件日志运行:I/FA(3818):adb shell setprop debug.firebase.analytics.app com.example.app I/FirebaseInitProvider( 3818):FirebaseApp 初始化成功 W/art(3818):之前 Android 4.1,方法 android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) 会错误地覆盖 package-private 方法 android.graphics.drawable.Drawable E/splash(3818):来自推送链接 D/AndroidRuntime(3818): 关闭 VM E/AndroidRuntime(3818): 致命异常:主 E/AndroidRuntime(3818):进程: com.example.app,PID:3818 E/AndroidRuntime(3818): java.lang.RuntimeException:无法启动活动 组件信息{com.example.app/com.example.app.SplashActivity}: java.lang.NullPointerException:尝试调用虚拟方法'int 空对象引用上的 java.lang.String.length()' E/AndroidRuntime(3818):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) E/AndroidRuntime(3818):在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) E/AndroidRuntime(3818):在 android.app.ActivityThread.-wrap12(ActivityThread.java) E/AndroidRuntime(3818):在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) E/AndroidRuntime(3818):在 android.os.Handler.dispatchMessage(Handler.java:102) E/AndroidRuntime( 3818): 在 android.os.Looper.loop(Looper.java:154) E/AndroidRuntime( 3818): 在 android.app.ActivityThread.main(ActivityThread.java:6077) E/AndroidRuntime(3818):在 java.lang.reflect.Method.invoke(本机 方法)E/AndroidRuntime(3818):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) E/AndroidRuntime(3818):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) E/AndroidRuntime(3818): 引起: java.lang.NullPointerException: 尝试在 a 上调​​用虚拟方法“int java.lang.String.length()” 空对象引用 E/AndroidRuntime(3818):在 java.io.StringReader.(StringReader.java:50) E/AndroidRuntime( 3818): 在 android.text.HtmlToSpannedConverter.convert(Html.java:758) E/AndroidRuntime(3818):在 android.text.Html.fromHtml(Html.java:245) E/AndroidRuntime(3818):在 android.text.Html.fromHtml(Html.java:188) E/AndroidRuntime(3818):在 com.example.app.SplashActivity.onCreate(SplashActivity.java:27) E/AndroidRuntime(3818):在 android.app.Activity.performCreate(Activity.java:6662) E/AndroidRuntime(3818):在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) E/AndroidRuntime(3818):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) E/AndroidRuntime(3818): ... 9 更多

【问题讨论】:

  • 我认为你没有检查你从意图中获取的值是否为空,这就是抛出 NPE 的原因。
  • 我已经深入研究了这个问题,发现这一点“com.example.app.SplashActivity.onCreate (SplashActivity.java:27)”检查这一行String link = String.valueOf(Html.fromHtml(Html.fromHtml(path).toString()));我看到它被提到为不推荐使用的代码您认为这会导致 Marshmallow 和 Nougat 出现问题吗?
  • @7geeky 调试应用后请检查问题的编辑更新

标签: java android nullpointerexception splash-screen


【解决方案1】:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    if(getIntent().getExtras() != null && this.getIntent().getExtras().containsKey("yourKey")){
        try {
            Log.e("splash", "from push link");

        path = getIntent().getExtras().getString("link");
        banner = getIntent().getExtras().getString("bannerImage");
        title = getIntent().getExtras().getString("title");
        String link = String.valueOf(Html.fromHtml(Html.fromHtml(path).toString()));
        String imgurl = String.valueOf(Html.fromHtml(Html.fromHtml(banner).toString()));
        Log.e("link----", "link--" + link);

        SharedPreferences pref = getApplicationContext().getSharedPreferences("Push", MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        String pushtitle = pref.getString("pushtitle", "");

        StringBuilder sb = new StringBuilder();
        sb.append(pushtitle).append(title).append(",");
        Log.e("pushtitle===========", sb.toString());
        editor.putString("pushtitle", sb.toString());

        String links = pref.getString("link", "");
        StringBuilder sb2 = new StringBuilder();
        sb2.append(links).append(link).append(",");
        Log.e("link===========", sb2.toString());
        editor.putString("link", sb2.toString());

        String imgurlstr = pref.getString("imgurl", "");
        StringBuilder sb3 = new StringBuilder();
        sb3.append(imgurlstr).append(imgurl).append(",");
        Log.e("imgurl===========", sb3.toString());
        editor.putString("imgurl", sb3.toString());

        editor.commit();
        } catch (NullPointerException e ) {
            path = "";
            banner = "";
            title = "";
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多