由MqttAndroidClient.publish()抛出的NPE,没有任何变量设置为null

时间:2017-05-01 13:11:52

标签: java android nullpointerexception try-catch mqtt

这个事件让我觉得我忘记了Java编程的一切,因为在没有任何变量设置为null的情况下抛出NPE。

在下一个代码中,如果msg和mqttAndroidClient都不为null,那么如果e等于NPE,进程如何到达catch子句?

BTW,根据MQTT文档,MqttAndroidClient不应该抛出NPE。

public class MainActivity extends AppCompatActivity {

    MqttAndroidClient mqttAndroidClient;

    final String serverUri = "tcp://iot.eclipse.org:1883";

    String clientId = "ExampleAndroidClient";
    final String publishTopic = "location";

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

        mqttAndroidClient = MqttClientSingleton.getMqttClient(getApplicationContext(), serverUri, clientId);
        mqttAndroidClient.setCallback(new MqttCallback() {

            @Override
            public void connectionLost(Throwable cause) {

                try {
                    mqttAndroidClient.connect();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }

            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {

            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {

            }
        });

        mqttAndroidClient.connect();

        try {
            MqttMessage msg = new MqttMessage("test".getBytes());
            mqttAndroidClient.publish(publishTopic, msg);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        ;
    }

}

这是MqttClientSingleton

import android.content.Context;

import org.eclipse.paho.android.service.MqttAndroidClient;

/**
 * Created by storassa on 4/30/17.
 */

public class MqttClientSingleton {
    private static MqttAndroidClient client;

    public static MqttAndroidClient getMqttClient(Context c, String uri, String id) {
        if (client == null) {
            client = new MqttAndroidClient(c, uri, id);
            return client;
        }
        else
            return client;
    }
}

这是logcat

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.storassa.android.giulia/com.storassa.android.giulia.MainActivity}: java.lang.RuntimeException: java.lang.NullPointerException
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2252)
  at android.app.ActivityThread.access$800(ActivityThread.java:139)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1200)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:136)
  at android.app.ActivityThread.main(ActivityThread.java:5103)
  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:788)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604)
  at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: java.lang.NullPointerException
  at com.storassa.android.giulia.MainActivity.onCreate(MainActivity.java:54)
  at android.app.Activity.performCreate(Activity.java:5275)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2166)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2252) 
  at android.app.ActivityThread.access$800(ActivityThread.java:139) 
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1200) 
  at android.os.Handler.dispatchMessage(Handler.java:102) 
  at android.os.Looper.loop(Looper.java:136) 
  at android.app.ActivityThread.main(ActivityThread.java:5103) 
  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:788) 
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604) 
  at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException
  at org.eclipse.paho.android.service.MqttAndroidClient.publish(MqttAndroidClient.java:812)
  at org.eclipse.paho.android.service.MqttAndroidClient.publish(MqttAndroidClient.java:668)
  at com.storassa.android.giulia.MainActivity.onCreate(MainActivity.java:52)
  at android.app.Activity.performCreate(Activity.java:5275) 
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2166) 
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2252) 
  at android.app.ActivityThread.access$800(ActivityThread.java:139) 
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1200) 
  at android.os.Handler.dispatchMessage(Handler.java:102) 
  at android.os.Looper.loop(Looper.java:136) 
  at android.app.ActivityThread.main(ActivityThread.java:5103) 
  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:788) 
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604) 
  at dalvik.system.NativeStart.main(Native Method) 

NEW EDIT

我添加了MqttClientSingleton代码和mqttAndroidClient.connect()在复制和粘贴中丢失的行

0 个答案:

没有答案