2009-12-04 7 views
11

Al ejecutar nuestro programa obtenemos una excepción de tipo java.lang.IllegalMonitorStateException. En el sitio web Java6 API, dice que hay un constructor que proporciona detalles sobre la excepción: IllegalMonitorStateException (String s)IllegalMonitorStateException

¿Cómo podemos usar esto para tener una mejor idea de dónde está el error en nuestro código? ¿Hay algo más que podamos hacer (además de mucha depuración, lo que estamos haciendo actualmente) para identificar la función o línea que falló?

Respuesta

0

Debe imprimir el seguimiento de la pila, que le dará la ubicación exacta en la fuente.

Desafortunadamente, no es raro que la JVM genere excepciones que no contengan ningún mensaje de detalle para ayudar en la depuración.

14

Los detalles deben darse cuando se crea la Excepción (Constructor, ¿verdad?) Y si no la está creando, no hay forma de que usted proporcione los detalles.

Puede analizar el StackTrace de la excepción. Muestra las clases, los métodos y la línea souce que fueron llamados para causar la excepción.

Una causa para el IllegalMonitorStateException es intentar esperar en un Objeto sin haber sincronizado en él. Vea el Javadoc.

Hay otras causas posibles y la excepción puede ser lanzada por alguna biblioteca/código externo. Creo que sólo el StackTrace puede ayudar ...

2

¿Cómo podemos utilizar esto para conseguir una mejor idea de donde el error está en nuestro código? ¿Hay algo más que podamos hacer (además de mucha depuración que estamos haciendo en la actualidad ) para identificar la función o la línea que falló?

En este caso, imprimir el mensaje por sí solo probablemente no ayude mucho. Lo que necesita es un stacktrace con los nombres de los archivos de origen y los números de línea.

  1. Asegúrese de que todos los archivos/jar ".class" relevantes se hayan creado con la información de depuración de archivos y números de línea. Este es el valor predeterminado, pero la compilación con "-g: none" quitará esto ... al igual que la mayoría de los ofuscadores de archivos JAR.

  2. A continuación, añadir un bloque try/catch para atrapar la IllegalMonitorStateException y, o bien llamar ex.printStackTrace() o ingrese la excepción.

Desde el stacktrace deberías poder ver qué línea en el código arrojó la excepción. Lo más probable es que haya sido una llamada al Object.wait(...) o algo así. Consulte javadoc para conocer el método ofensivo para averiguar qué circunstancias provocan que se produzca la excepción.

(Y una vez que haya terminado, recuerde que debe mover el bloque try/catch ha agregado.)

9

Esto está ocurriendo tal vez debido a que la instancia del objeto que realiza la llamada espera o indicarnos en es diferente que la instancia sincronizaste con.Por ejemplo:

Integer  a; 

a = new Integer(0);  

synchronized(a) { 
    System.out.printf("I synchronized on %h.", a); 
    ++a; 
    System.out.printf("But, I am calling notify for %h and I hold no lock for it.", a); 
    a.notify(); 
} 

Esto lanzará el IllegalMonitorStateException porque la instancia que los puntos de 'A' a ya no es la misma.