Android JSONTokener-未捕获nextCleanInternal处的空指针异常

Android JSONTokener-未捕获nextCleanInternal处的空指针异常,android,json,nullpointerexception,parse-platform,Android,Json,Nullpointerexception,Parse Platform,我将在onCreate()方法中处理一个JSONObject。它被包围在一个try/catch块中,我原以为该块会捕获所有异常,但似乎仍然会遇到nullpointerexception并导致应用程序崩溃。我进行了检查,以确保我在对象中搜索的字符串不为null/空,并且我不确定如何防止异常。代码和堆栈跟踪如下所示: Bundle bundle = getIntent().getExtras(); if (bundle != null) { JSONObject notifi

我将在onCreate()方法中处理一个JSONObject。它被包围在一个try/catch块中,我原以为该块会捕获所有异常,但似乎仍然会遇到nullpointerexception并导致应用程序崩溃。我进行了检查,以确保我在对象中搜索的字符串不为null/空,并且我不确定如何防止异常。代码和堆栈跟踪如下所示:

Bundle bundle = getIntent().getExtras();
    if (bundle != null) {
        JSONObject notificationData;
        try {
            notificationData = new JSONObject(bundle.getString("com.parse.Data"));
            if(notificationData.getString("targetUrl") != null && !notificationData.getString("targetUrl").equals("")){
                //do stuff
            }
        } catch (Exception e) {
        }
    }
}
错误在这一行:

notificationData = new JSONObject(bundle.getString("com.parse.Data"));
堆栈跟踪:

java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example.Test/com.example.Test.MainActivity}:
java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
at org.json.JSONTokener.nextValue(JSONTokener.java:94)
at org.json.JSONObject.<init>(JSONObject.java:155)
at org.json.JSONObject.<init>(JSONObject.java:172)
at com.example.Test.MainActivity.onCreate(SourceFile:293)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
java.lang.RuntimeException:无法启动活动
ComponentInfo{com.example.Test/com.example.Test.MainActivity}:
java.lang.NullPointerException
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
在android.app.ActivityThread.access$800(ActivityThread.java:135)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:136)
位于android.app.ActivityThread.main(ActivityThread.java:5001)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
在dalvik.system.NativeStart.main(本机方法)
原因:java.lang.NullPointerException
位于org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
位于org.json.JSONTokener.nextValue(JSONTokener.java:94)
位于org.json.JSONObject(JSONObject.java:155)
位于org.json.JSONObject(JSONObject.java:172)
位于com.example.Test.MainActivity.onCreate(源文件:293)
位于android.app.Activity.performCreate(Activity.java:5231)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
位于android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)

我不太熟悉在Java/Android中使用JSONObject。如何防止出现此空指针?

不建议尝试捕获NPE

我假设您的代码崩溃是因为
bundle.getString(“com.parse.Data”)
实际上是
null

我建议检查
null
,因此如下更改:

if (bundle != null && bundle.getString("com.parse.Data") != null)

这将避免你得到的NPE。如果您确实设法从捆绑包中取出了字符串,那么在尝试构建
JSONObject
时可能还会遇到其他异常。无法帮助您,需要查看更多代码。

我原以为try/catch函数可以捕获找到的任何nullpointerexception。因此,即使
bundle.getString(“com.parse.Data”)
为空,当抛出异常时,它也在
try
块内。所以我认为这意味着它会被抓住,我可以相应地处理它。我已经添加了您的建议,并将尝试一下,看看它是否解决了我的问题。NPE是一个运行时异常。为了更好地理解你能抓什么和抓不到什么,请参见此处。这是更好的解释。