Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gson对java使用WebSocket时出现奇怪的NullPointerException_Java_Node.js_Sockets_Websocket_Gson - Fatal编程技术网

Gson对java使用WebSocket时出现奇怪的NullPointerException

Gson对java使用WebSocket时出现奇怪的NullPointerException,java,node.js,sockets,websocket,gson,Java,Node.js,Sockets,Websocket,Gson,我正在使用java中的WebSocket连接到我的nodeJS服务器。 我还使用Gson解析请求和响应Json 我有个例外: Exception in thread "main" java.lang.NullPointerException at Main.main(Main.java:23) 在这一行: ConnectionResponse connectionResponse = gson.fromJson(messageContainer.getMessage(), Connec

我正在使用java中的WebSocket连接到我的nodeJS服务器。 我还使用Gson解析请求和响应Json

我有个例外:

Exception in thread "main" java.lang.NullPointerException
at Main.main(Main.java:23)
在这一行:

    ConnectionResponse connectionResponse = gson.fromJson(messageContainer.getMessage(), ConnectionResponse.class);
如果我的Gson初始化不在Gson.toJson()方法调用之前

这段代码对我来说非常有效:

 import com.google.gson.Gson;

import java.net.URI;
import java.net.URISyntaxException;

public class Main {
public static void main(String[] args) {
    try {

        // open websocket
        final WebsocketClientEndpoint clientEndPoint = new WebsocketClientEndpoint(new URI("ws://localhost:8000"));
        // add listener

        MessageContainer messageContainer = new MessageContainer();
        clientEndPoint.addMessageHandler(messageContainer);

        // send message to websocket
        clientEndPoint.sendMessage("{\"type\":\"Connect\",\"name\":\"FrontClient\"}");

        Gson gson = new Gson();
        ConnectionResponse connectionResponse = gson.fromJson(messageContainer.getMessage(), ConnectionResponse.class);

        System.out.println(connectionResponse.toString() + "yay");


        // wait 5 seconds for messages from websocket
        Thread.sleep(5000);

    } catch (URISyntaxException ex) {
        System.err.println("URISyntaxException exception: " + ex.getMessage());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }


}
}

但如果我移动 Gson Gson=新的Gson(); a在之前的某个地方,由于上面的错误而崩溃。

例如,此代码不起作用:

    import com.google.gson.Gson;

import java.net.URI;
import java.net.URISyntaxException;

public class Main {
    public static void main(String[] args) {
    try {
        Gson gson = new Gson();

        // open websocket
        final WebsocketClientEndpoint clientEndPoint = new WebsocketClientEndpoint(new URI("ws://localhost:8000"));
        // add listener

        MessageContainer messageContainer = new MessageContainer();
        clientEndPoint.addMessageHandler(messageContainer);

        // send message to websocket
        clientEndPoint.sendMessage("{\"type\":\"Connect\",\"name\":\"FrontClient\"}");

        ConnectionResponse connectionResponse = gson.fromJson(messageContainer.getMessage(), ConnectionResponse.class);

        System.out.println(connectionResponse.toString() + "yay");


        // wait 5 seconds for messages from websocket
        Thread.sleep(5000);

    } catch (URISyntaxException ex) {
        System.err.println("URISyntaxException exception: " + ex.getMessage());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }


}
}
或者这个:

    import com.google.gson.Gson;

import java.net.URI;
import java.net.URISyntaxException;

public class Main {
    public static void main(String[] args) {
        try {

            // open websocket
            final WebsocketClientEndpoint clientEndPoint = new WebsocketClientEndpoint(new URI("ws://localhost:8000"));
            // add listener

        MessageContainer messageContainer = new MessageContainer();
        clientEndPoint.addMessageHandler(messageContainer);

        Gson gson = new Gson();

        // send message to websocket
        clientEndPoint.sendMessage("{\"type\":\"Connect\",\"name\":\"FrontClient\"}");

        ConnectionResponse connectionResponse = gson.fromJson(messageContainer.getMessage(), ConnectionResponse.class);

        System.out.println(connectionResponse.toString() + "yay");


        // wait 5 seconds for messages from websocket
        Thread.sleep(5000);

    } catch (URISyntaxException ex) {
        System.err.println("URISyntaxException exception: " + ex.getMessage());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }


}

}

有人能帮我解决这个问题吗?你能提供一个完整的例外情况吗?但更好的方法是使用IDE调试它,或者添加类似System.out.println()的日志记录;对于第23行中的所有对象,另一种理论认为“clientEndPoint.sendMessage”是异步调用,“new Gson()”构造函数需要足够的时间来接收服务器响应。如果您在“.gson.fromJson(messageContainer.getMessage(),…”之前添加“sleep(…)”,它将适用于任何“new gson()”位置。@MakSymprokorenko您的解决方案可以工作,非常感谢:)@MakSymprokorenko但这不是很奇怪,当gson初始化正好在clientEndpoint.sendMessage()方法之前时,它没有Thread.sleep()可以工作吗?这样,Gson的初始化时间最短。。六羟甲基三聚氰胺六甲醚