OkHttpClient выдает исключение NullPointerException

Я пытаюсь отправить некоторые данные по WiFi, используя OkHttp3.

Я создал клиент, используя

import okhttp3.OkHttpClient;
.....
public OkHttpClient client;

После нажатия кнопки я настроил веб-сокет,

private void start() {
    Request request = new Request.Builder().url("ws://192.168.1.84:81/").build();
    EchoWebSocketListener listener = new EchoWebSocketListener();
    WebSocket ws = client.newWebSocket(request, listener);

    client.dispatcher().executorService().shutdown();
}

Где EchoWebSocketListener является расширением WebSocketListener, полный список ниже.

Но я продолжаю получать следующую ошибку во время выполнения...

java.lang.NullPointerException: Attempt to invoke virtual method 'okhttp3.WebSocket okhttp3.OkHttpClient.newWebSocket(okhttp3.Request, okhttp3.WebSocketListener)' on a null object reference

При отслеживании этой строки в функции start(),

WebSocket ws = client.newWebSocket(request, listener);

Почему client это null?

Полный листинг кода:

package qdivision.org.qrtracker;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okio.ByteString;

public class Move extends AppCompatActivity {

    public OkHttpClient client;
    public TextView output;
    private ImageButton forward;
    public String dataFrame;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_move);
        Intent intent = getIntent();

        forward  = (ImageButton) findViewById(R.id.forward_button);
        forward.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dataFrame = "<192.168.1.84,CMD,KEY,57,33>";
                start();
            }
        });
    }

    private final class EchoWebSocketListener extends WebSocketListener {
        private static final int NORMAL_CLOSURE_STATUS = 1000;

        @Override
        public void onOpen(WebSocket webSocket, Response response) {
            webSocket.send(dataFrame);
            webSocket.close(NORMAL_CLOSURE_STATUS, "Goodbye !");
        }

        @Override
        public void onMessage(WebSocket webSocket, String text) {
            output("Receiving : " + text);
        }

        @Override
        public void onMessage(WebSocket webSocket, ByteString bytes) {
            output("Receiving bytes : " + bytes.hex());
        }

        @Override
        public void onClosing(WebSocket webSocket, int code, String reason) {
            webSocket.close(NORMAL_CLOSURE_STATUS, null);
            //output("Closing : " + code + " / " + reason);
        }

        @Override
        public void onFailure(WebSocket webSocket, Throwable t, Response response) {
            output("Error : " + t.getMessage());
        }
    }

    private void start() {
        Request request = new Request.Builder().url("ws://192.168.1.84:81/").build();
        EchoWebSocketListener listener = new EchoWebSocketListener();
        WebSocket ws = client.newWebSocket(request, listener);

        client.dispatcher().executorService().shutdown();
    }

    private void output(final String txt) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                output.setText(output.getText().toString() + "\n\n" + txt);
            }
        });
    }

}

Вы только что объявили client, но он так и не был инициализирован.

Niraj Chauhan 15.05.2019 14:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
1 346
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы забыли инициализировать клиента, поэтому переменная клиента по-прежнему равна нулю. Делай так:

private void start() {
        //Here we initialize client variable
        client = new OkHttpClient();

        Request request = new Request.Builder().url("ws://192.168.1.84:81/").build();
        EchoWebSocketListener listener = new EchoWebSocketListener();

        // Then we could use it like so:
        WebSocket ws = client.newWebSocket(request, listener);    
        client.dispatcher().executorService().shutdown();
    }

Другие вопросы по теме