微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 lambda 对象的引用传递给另一个类方法,导致 Java 中的 NullPointerException

如何解决将 lambda 对象的引用传递给另一个类方法,导致 Java 中的 NullPointerException

我想创建一个委托模式,其中从一个方法收到的结果然后被另一个方法使用。这里我有 2 个类,SocketListenerSocketConsumer,第一个监听从 WebSocket 服务器发送的消息,第二个使用这个消息。

在我的 SocketListener 课上:

public class SocketListener extends WebSocketListener {
    private final String TAG = SocketListener.class.getName();
    private Consumer<String> msgConsumer;
    @Override
    public void onMessage(@NotNull WebSocket webSocket,@NotNull String text) {
        // delegate this message to another class.
        Log.d(TAG,"Receive msg from the server " + text);
        consumeMessage(text);
    }

    public void setMsgConsumer(Consumer<String> msgConsumer) {
        this.msgConsumer = msgConsumer;
    }

    public void consumeMessage(String msg) {
        if (this.msgConsumer != null)  { // the msgConsumer is null! 
            this.msgConsumer.accept(msg);
        } else {
            throw new IllegalStateException("No handler");
        }
    }

    // receives a message from the server:
    @Override
    public void onMessage(@NotNull WebSocket webSocket,"Receive msg from the server " + text);
        consumeMessage(text);
    }

}

在我的 SocketConsumer 课上:

public class SocketConsumer extends AppCompatActivity {
    private final String TAG = SocketConsumer.class.getName();
    private WebSocket websocket;
    private Button sendBtn;
    private TextView editableText;
    private TextView serverResponseView;

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // some code removed for brevity ...
        super.onCreate(savedInstanceState);
        String url = "http://10.0.2.2:8081/ws";
        this.websocket = new WebSocketClient(url).getWebSocket();
        SocketListener socketListener = new SocketListener();
        socketListener.setMsgConsumer(this::consumeMessage);
    }

    public void consumeMessage(String msg) {
        Log.d(TAG,"Consume message sent from the server: " + msg);
        JsonObject resp = JsonParser.parseString(msg).getAsJsonObject();
        if (!"OK".equals(resp.get("status").getAsstring())) {
            serverResponseView.setTextColor(Color.RED);
        }
        serverResponseView.append(msg);
    }
}

当我启动我的Android应用程序时,它应该首先创建一个SocketConsumer类的实例,然后在onCreate方法中执行指令,这里我使用方法引用来传递一个lambda表达式为了使用从 SocketListener 类收到的消息,我尝试打印出 msgConsumer 类中 SocketListener 字段的地址,这给了我:com.example.websocket_client.-$$Lambda$pEwgXNeYEcYVwPIH33WBMpCvjM0@fda50e0。这不是空的,但是当新消息到达并且我调用 consumeMessage 函数时,它是空的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。