2014-08-29 98 views
0

我正在通过我的onCreate()方法中的JSONObject。它被包围在try/catch块中,我认为它会捕获所有异常,但似乎仍然遇到nullpointerexception并使应用程序崩溃。我有检查,以确保我在对象中搜索字符串不是空/空,我不知道如何保护免受异常。代码和堆栈跟踪如下:Android JSONTokener - nextCleanInternal中的Nullpointer异常未被捕获

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中使用一个JSONObjects经历/ Android系统。我能做些什么来防止发生这种空指针?

回答

1

试图抓住NPE并不是真的建议。

我假设你的代码崩溃,因为bundle.getString("com.parse.Data")实际上是null

我建议检查null,所以改变这样的:

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

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

+0

我曾认为try/catch函数会捕获找到的任何nullpointerexception。因此,即使'bundle.getString(“com.parse.Data”)'为null,它在引发异常时位于'try'块内。所以我认为这意味着它会被抓住,我可以相应地处理它。我已经添加了您的建议,并会尝试查看它是否解决了我的问题。 – 2014-08-29 18:56:38

+1

NPE是运行时异常。为了更好地理解你可以和不能捕捉的东西,请看这里http://stackoverflow.com/questions/1375113/java-exception-not-caught。它被解释得更好。 – nightfixed 2014-08-29 19:04:24