servidor - sockets en java enviar y recibir
NullPointerException lanzada en el método java sincronizado usando sockets (5)
Tengo una aplicación para 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 llegan desde el dispositivo.
Cuando llega un mensaje, el oyente envía el mensaje a un método en la clase de conexión, reportMessage () . Aquí es donde se procesa el mensaje.
La clase Listener 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, entonces a veces recibo un error que bloquea el programa.
Cuando se ejecuta en modo de depuración, obtengo una NullPointerException lanzada en lo que sea que sea 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 un System.out.println o una línea de código real.
Y el error no queda atrapado por el intento y la captura. Bloquea el programa y no se maneja el error aunque ocurra en el try y catch.
Esto me lleva a creer que el error no está siendo arrojado por nada en el método reportMessage () . Si este es el caso, entonces tal vez el error se está lanzando en la clase Listener .run () .
Sin embargo, no puedo ver de dónde se puede generar una excepción NullPointerException , ya que he intentado hacer todas las comprobaciones y, cuando se lanza, se lanza cuando hay mensajes enviados.
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é está arrojando la NullPointerException y cómo detenerla!
EDITAR: Gracias a mucha ayuda, ahora resulta que es la excepción que estoy atrapando e intentando obtener la causa de la cual es nula. ¡Aún estoy tratando de averiguar de dónde viene!
En lugar de:
if("".equals(newResponse))
Utilizar esta:
if(newResponse==null)
Una cadena vacía no es lo mismo que un objeto null
; por lo tanto, en los casos en que newResonse
sea null
, no se inicializará con un objeto String
adecuado y terminará con el NPE.
Supongo que se lanzará una excepción en processMessage, atrapado en la captura debajo de él, pero el getCause es nulo.
1 / Intente registrar la excepción antes de manejarlo
2 / Mira en el mensaje de proceso, debe haber una excepción lanzada.
Una cosa que veo es que en reportMessage (), estás comprobando si newResponse es una cadena vacía, sin embargo, no la has inicializado antes, por lo que es muy probable que sea nula. Probablemente lo que quieres es
if(newResponse == null) {
newResponse = new String();
}
message
o newResponse
pueden ser nulos porque se convertirán 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 ...
}
if((newResponse==null) || ("".equals(newResponse))
O usa guayabas brillantes:
if(Strings.isNullOrEmpty(newResponse))