Java 连接到Mqtt联机代理时发生NullPointerException

Java 连接到Mqtt联机代理时发生NullPointerException,java,mqtt,mosquitto,paho,Java,Mqtt,Mosquitto,Paho,我正在尝试使用下面的代码和Java中的Paho库连接到在线代理: private final String brokerURI = "test.mosquitto.org:1883"; //should be changed to 8883 with SSL try { //tentativo di creazione del client client = new MqttClient(brokerURI, idClient); <--NullPointerExcepti

我正在尝试使用下面的代码和Java中的Paho库连接到在线代理:

private final String brokerURI = "test.mosquitto.org:1883"; //should be changed to 8883 with SSL
try { //tentativo di creazione del client
        client = new MqttClient(brokerURI, idClient); <--NullPointerException here
        client.setCallback(new ClientCallback(codaTopic, codaMessaggi, finestra)); //set delle callback
        setConnectionOptions(); //set delle opzioni connessione
        client.connect(opzioni); //connessione al server
    } catch (MqttException e) {
        System.err.println(e.getMessage());
        System.err.println("Connessione fallita Client, riavviare il sistema.");
    }
但是在创建
MqttClient
时,它继续显示
NullPointerException
。特别是控制台显示:

Exception in thread "Thread-3" java.lang.NullPointerException
at org.eclipse.paho.client.mqttv3.MqttConnectOptions.validateURI(MqttConnectOptions.java:489)
at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:291)
at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:185)
at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:226)
at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:138)
at client.Client.run(Client.java:78)
在尝试使用说明订阅主题时

client.subscribe(topic, 1);

topic参数是一个包含主题名称的字符串。

Mosquitto的URI需要协议。看看它的源代码,这就是抛出异常的地方,class
MqttConnectOpts.java

protected static int validateURI(String srvURI) {
    try {
        URI vURI = new URI(srvURI);
        if (!vURI.getPath().equals("")) {
            throw new IllegalArgumentException(srvURI);
        }
        if (vURI.getScheme().equals("tcp")) {
            return URI_TYPE_TCP;
        }
        else if (vURI.getScheme().equals("ssl")) {
            return URI_TYPE_SSL;
        }
        else if (vURI.getScheme().equals("local")) {
            return URI_TYPE_LOCAL;
        }
        else {
            throw new IllegalArgumentException(srvURI);
        }
    } catch (URISyntaxException ex) {
        throw new IllegalArgumentException(srvURI);
    }
}
因此,它接受3种类型的协议前缀:
tcp、ssl、local
。关于您的示例,您可以这样尝试:

  • TCP

     private final String brokerURI = "tcp://test.mosquitto.org:1883";
    
  • SSL

    private final String brokerURI = "ssl://test.mosquitto.org:8883";
    

什么是idClient?idClient是一个简单的字符串,通常是“mario”或类似名称
 private final String brokerURI = "tcp://test.mosquitto.org:1883";
private final String brokerURI = "ssl://test.mosquitto.org:8883";