NullPointerException lanzada en un método sincronizado de Java usando sockets

Tengo una aplicación de Android escrita en Java.

La aplicación básicamente se conecta a un dispositivo que envía los mensajes de la aplicación. La aplicación espera a que lleguen los mensajes y luego los informa, antes de procesar cada mensaje.

Tengo una clase Connection y una clase Listener .

La clase Connection se inicia a través del constructor, que configura la clase Listener para escuchar los mensajes que ingresan desde el dispositivo.

Cuando llega un mensaje, el oyente envía el mensaje a un método en la clase Connection, reportMessage () . Aquí es donde se procesa el mensaje.

La clase de escucha está en un hilo separado.

El código se muestra a continuación.

public class Connection 
{
    private String response;
    private String newResponse;

    private DataInputStream reader;

    private DataOutputStream writer; 

    private Socket socket;

    private boolean keepListening;

    private Listener listener;

    public Connection (String _ipAddress, int portNumber)
    {
        newResponse = "";

        try 
        {
            socket = new Socket(_ipAddress, _port);   //Connect to the server and its socket

            writer = new DataOutputStream(socket.getOutputStream()); //Connect to the server to receive and send messages

            reader = new DataInputStream(socket.getInputStream());

            listener = new Listener(reader, this); //Create a new listener for the client

            new Thread(listener).start(); //Set the listener off running
        } 
        catch (Exception e) 
        {
            ...
        } 
    }

    public synchronized void reportMessage(String message)
    {
        try
        {
            if("".equals(newResponse))
            {
                newResponse = new String();
            }

            newResponse = newResponse + message;

            System.out.println("Message Received: " + newResponse);

            processMessage(); //Process the message
        }
        catch (Exception e)
        {
            response = e.getCause().toString();
        }
    }
}

public class Listener implements Runnable 
{
    private DataInputStream reader = null;

    private boolean keepListening;

    private String serverMessage;

    private Connection connection;

    public Listener (DataInputStream inFromServer, Connection connection)
    {
        reader = inFromServer;
                               //Get the client connection's message transfer
        keepListening = true;

        this.connection = connection;
    }

    public void run()
    {
        while (keepListening)
        {
            try
            {
                if (reader.available() > 0)
                {
                    byte[] readInData = new byte[reader.available()];  //Initialise the array

                    reader.read (readInData);  //Read in the data

                    serverMessage = Utils.byteToString(readInData);

                    connection.reportMessage(serverMessage);   //Report the message
                }
            }
            catch (IOException e)
            {
                System.out.println("Error reading." + e.getLocalizedMessage().toString());

                keepListening = false;
            }

            keepListening = connection.getKeepListening();
        }
    }
}

Esto funciona bien por un tiempo, luego a veces recibo un error que bloquea el programa.

Cuando se ejecuta en modo de depuración, recibo una NullPointerException lanzada en la primera línea de reportMessage () en la clase Connection .

El programa se suspende en cualquier línea que sea la primera línea, ya sea System.out.println o una línea de código real.

Y el error no queda atrapado por el intento y la captura. Se bloquea el programa y no se maneja el error a pesar de que ocurre en el intento y captura.

Esto me lleva a creer que el error no está siendo arrojado por nada en el método reportMessage () . Si este es el caso, tal vez el error se está generando en la clase de escucha .run () .

Sin embargo, no puedo ver desde dónde se puede lanzar cualquier NullPointerException , ya que he intentado hacer todas las comprobaciones y cuando se lanza, se lanza cuando se envían mensajes.

El depurador dice "Un seguimiento de pila de excepción no está disponible".

El LogCat dice:

  08-21 10:35:57.894: E/AndroidRuntime(1118): FATAL EXCEPTION: Thread-12
  08-21 10:35:57.894: E/AndroidRuntime(1118): java.lang.NullPointerException
  08-21 10:35:57.894: E/AndroidRuntime(1118):atCom.que.wifiaudio.Connection.reportMessage(Connection.java:339)
  08-21 10:35:57.894: E/AndroidRuntime(1118):   at com.que.wifiaudio.Listener.reportIncomingMessage(Listener.java:93)
  08-21 10:35:57.894: E/AndroidRuntime(1118):   at com.que.wifiaudio.Listener.run(Listener.java:67)

  08-21 10:35:57.894: E/AndroidRuntime(1118):   at java.lang.Thread.run(Thread.java:1102)

¿Alguien puede ayudarme?

¡Necesito saber qué arroja la NullPointerException y cómo detenerla!

EDITAR: Gracias a una gran cantidad de ayuda, ahora resulta que es la Excepción que estoy captando y tratando de obtener la causa que es nula. Sin embargo, todavía estoy tratando de averiguar de dónde viene.

Respuesta 1

Supongo que se lanzará una excepción en processMessage, atrapada en la captura debajo, pero getCause es nulo.

1 / Intente registrar la excepción antes de manejarla

2 / Mire en processMessage, debería haber una excepción lanzada.

Respuesta: 2
  if((newResponse==null) || ("".equals(newResponse))

O use guayabas brillantes:

  if(Strings.isNullOrEmpty(newResponse))
Respuesta: 3

messageo newResponsepuede ser nula, ya que conseguirá convertir en message.toString()y newResponse.toString()por el compilador.

Agregar condición para verificación nula:

if(message != null && newResponse!=null) {
   newResponse = newResponse + message;
} else {
   // throw exception ...
}
Respuesta: 4

Una cosa que veo es que en reportMessage (), está verificando si newResponse es una cadena vacía; sin embargo, no la ha inicializado antes, por lo que probablemente sea nulo. Probablemente lo que quieres es

if(newResponse == null) {
    newResponse = new String();
}
Respuesta: 5

IntelliJ IDEA Ultimate 2018.3.5 código duplicado no resaltado sobre la marcha. He marcado la casilla de verificación de Configuración -> Inspecciones -> General, pero nada está resaltado cuando he duplicado ...

¿Cómo puedo configurar jetty para implementar solo una aplicación web específica y deshabilitar la implementación en caliente (deshabilitar el monitoreo del directorio webapps, deshabilitar la verificación de cambios en esta aplicación única)

Estoy usando Eclipse para ejecutar aplicaciones que usan el complemento maven tomcat en el entorno local. Cada clase utiliza org.apache.log4j.Logger para iniciar sesión, como: privado estático final Logger logger = LogManager.getLogger (...

Tengo código Java y Scale en el proyecto. Editar 2 tipos de código en una tarea es común. Ingresé el esquema google-java-code-style para el formato de código Java e instalé el complemento scalafmt en ...