【问题标题】:Null pointer exception new JSONobject(String)空指针异常 new JSONobject(String)
【发布时间】:2015-04-15 21:22:15
【问题描述】:

我有一个广播接收器,它从 onRecieve 方法的意图中获取 JSONObject。然后它从 JSONObject 中获取一些数据。

try {
            Bundle bundle = intent.getExtras();
            jsonData = bundle.getString("com.parse.Data");

            object = new JSONObject(jsonData);
            action = object.getString("action");
            id = object.getString("id");

            userQuery.whereEqualTo("objectId", id);

        } catch (JSONException e) {

        }

当我运行应用程序时,这里会导致空指针异常...

object = new JSONObject(jsonData);

我运行了调试器并停止了

userQuery.whereEqualTo("objectId", id);

Object 不是 null,action、id 或 jsonData 也不是。我对此有点困惑。这是在此之后运行的下一个代码块...

userQuery.findInBackground(new FindCallback<ParseUser>() {
            @Override
            public void done(List<ParseUser> parseUsers, ParseException e) {
                user = parseUsers.get(0);
                if(action.equals(connectAction)){
                    if(!connectedB){
                        connectedB = true;
                            Intent broadcast = new Intent();
                            broadcast.setAction(yesAction);
                            broadcast.putExtra("extra","yes");
                            context.sendBroadcast(broadcast);

                    }

                }
            }

        });

这只是在 Parse 中搜索具有相同对象 ID 的用户。然后一旦它找到一个,它就会向我在另一个活动中拥有的另一个广播接收器发送一个广播。在此之后没有其他代码。这是原木猫。

          04-15 23:04:30.983  11802-11802/joke.app.randomchat E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: joke.app.randomchat, PID: 11802
java.lang.RuntimeException: Unable to start receiver joke.app.randomchat.MessageReciever: java.lang.NullPointerException
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:2580)
        at android.app.ActivityThread.access$1700(ActivityThread.java:151)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
        at android.os.Handler.dispatchMessage(Handler.java:110)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:5292)
        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:824)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
        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 joke.app.randomchat.MessageReciever.onReceive(MessageReciever.java:57)
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:2573)

第 57 行是我上面谈到的那一行。我该如何解决这个问题?

这是我在 userQuery 处停止它时的值...

Bundle[{com.parse.Data={"id":"at790nlYIN","action":"joke.app.randomchat.intent.CONNECT","push_hash":"d41d8cd98f00b204e9800998ecf8427e"}, com.parse.Channel=null}]

这是对象

{"action":"joke.app.randomchat.intent.CONNECT","id":"at790nlYIN","push_hash":"d41d8cd98f00b204e9800998ecf8427e"}

动作字符串

joke.app.randomchat.intent.CONNECT

标识字符串

at790nlYIN

json数据

{"id":"at790nlYIN","action":"joke.app.randomchat.intent.CONNECT","push_hash":"d41d8cd98f00b204e9800998ecf8427e"}

【问题讨论】:

  • 你确认jsonData不为空吗?
  • 是的。起初我以为是这样,但它包含正确的信息。
  • 如果jsonData的内容不太大,或者只是其中的一部分,你可能想显示它。
  • 检查你收到的json字符串是否有效。
  • com.parse.Data 是您通过意图发送的字符串的键吗?

标签: android json parse-platform nullpointerexception broadcastreceiver


【解决方案1】:

好的,我刚刚发现了这个问题。它不是使用 jsonData 或 JSONObject。在这段代码中...

userQuery.findInBackground(new FindCallback<ParseUser>() {
        @Override
        public void done(List<ParseUser> parseUsers, ParseException e) {
            user = parseUsers.get(0);
            if(action.equals(connectAction)){
                if(!connectedB){
                    connectedB = true;
                        Intent broadcast = new Intent();
                        broadcast.setAction(yesAction);
                        broadcast.putExtra("extra","yes");
                        context.sendBroadcast(broadcast);

                }

            }
        }

    });

我向另一个接收者发送了一个广播,但将动作设置为错误的动作。所以它再次调用了这个接收器,并且意图在 com.parse.Data 中没有任何内容。一旦我改变了

broadcast.setAction(yesAction);

broadcast.setAction(receivedUpdate);

效果很好。

【讨论】:

    【解决方案2】:

    这就是你的做法:

    try {
        JSONObject jsonData = new JSONObject(intent.getExtras().getString("com.parse.Data"));
    
    
        action = jsonData .getString("action");
        id = jsonData .getString("id");
    
        userQuery.whereEqualTo("objectId", id);
    
    } catch (JSONException e) {
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      相关资源
      最近更新 更多