2010-04-19 14 views
6

Tengo el siguiente código:¿Por qué este break break break no funciona?

public void post(String message) { 
    final String mess = message; 
    (new Thread() { 
     public void run() { 
      while (true) { 
       try { 
        if (status.equals("serviceResolved")) { 
         output.println(mess); 
         Game.log.fine("The following message was successfully sent: " + mess); 
         break; 
        } else { 
         try {Thread.sleep(1000);} catch (InterruptedException ie) {} 
        } 
       } catch (NullPointerException e) { 
        try {Thread.sleep(1000);} catch (InterruptedException ie) {} 
       } 
      } 
     } 
    }).start(); 
} 

En mi archivo de registro encuentro un montón de líneas de la siguiente manera:

The following message was successfully sent: blablabla 
The following message was successfully sent: blablabla 
The following message was successfully sent: blablabla 
The following message was successfully sent: blablabla 

Y mi programa no responde.

Me parece que el comando break no funciona. ¿Cuál puede ser una posible razón para eso?

Lo interesante es que no ocurre todo el tiempo. A veces mi programa funciona bien, a veces ocurre el problema descrito anteriormente.

+0

FWIW: podría factorizar las dos líneas Thread.sleep() en una sola línea ejecutada después del try/catch externo. –

+2

La captura de 'NullPointerException' no parece una gran idea (se supone que debe verificar si' status == null' - si es así, comprueba si 'status' es' null' en su lugar).Y 'InterruptedException' debería hacerse para salir del ciclo (no es que me guste la interrupción de hilo, pero está allí y por lo tanto debería tratarse)./También puede hacer que el parámetro 'final', por lo que no necesita la copia' mess'. –

+0

Esta es una razón clara de por qué nunca debe silenciar una excepción a menos que realmente necesite hacerlo: la depuración se convierte en un infierno. – Jack

Respuesta

3

Está iniciando un nuevo hilo cada vez que llama al método de publicación. Creo que el método está bien, pero el programa de llamadas no.

+0

probablemente debería estar usando una cola, con una tarea thread/executor que se inicia una vez y lee la cola –

+0

Tiene razón. Tenía muchas líneas del mensaje porque el código anterior fue llamado muchas veces y lo llamaron muchas veces porque presioné el botón de enviar muchas veces (cuando mi programa estaba congelado). Y mi programa se congeló debido a otro error estúpido que no está relacionado con el código dado. – Roman

4

Podría ser que esta línea tiene éxito:

output.println(mess); 

pero esta línea es lanzar una excepción de puntero nulo:

Game.log.fine(... 

En este caso, verá la salida en la consola, pero la declaración de ruptura nunca se alcanza. ¿Es Game.log quizás nulo?

+1

Esto no puede ser, porque informó haber visto 'El siguiente mensaje se envió con éxito:', que es de la línea 'Game.log'. – polygenelubricants

+1

¿Me falta algo? El OP dice que está obteniendo resultados en el registro, lo que implica que 'Game.log' no puede ser' nulo' ... –

+0

También lo tomaría como una lección para minimizar el alcance de los bloques try para que las capturas sean más significativo. –

4

¿Qué hace exactamente Game.log.fine? ¿Podría ser que arroje una NullPtrException después del resultado, o podría ser que llame al post-método varias veces?

Elimine la captura de NullPointerException, este es un estilo incorrecto (la ocurrencia de una NullPointerException es siempre un error de programación) y agregue algunos mensajes de registro en el método (o use un depurador).

2

¿Estás seguro de que quieres continuar con una NullPointerException? Si obtienes uno dentro del ciclo, es probable que esperes por siempre.

Si está seguro de que status voluntad siempre eventual ser "serviceResolved", a continuación, poner una try ... finally dentro de la sentencia if para que si algo falla, el bucle todavía existe:

if (status.equals("serviceResolved")) { 
    // No matter what happens next, we have to bail 
    try { 
     output.println(mess); 
     Game.log.fine("The following message was successfully sent: " + mess); 
    } finally { 
     break; 
    } 
} else { 
    try {Thread.sleep(1000);} catch (InterruptedException ie) {} 
} 
0

Usted 'suponiendo que la instrucción break no funciona, pero podría ser que su método post se llame repetidamente. Intente agregar otra declaración de registro al comienzo del método para ver con qué frecuencia se la está llamando. Además, coloque una instrucción de registro después del bucle while pero antes del final del método run para verificar que el break realmente se salió del bucle.

También estoy de acuerdo con los otros carteles que la captura NullPointerException es un olor a código. Primero debe verificar sus variables para null.