2011-08-09 8 views
12
public class Strange1 { 
    public static void main(String[] args) { 
    try { 
     Missing m = new Missing(); 
    } catch (java.lang.NoClassDefFoundError ex) { 
     System.out.println("Got it!"); 
    } 
    } 
} 

public class Strange2 { 
    public static void main(String[] args) { 
    Missing m; 
    try { 
     m = new Missing(); 
    } catch (java.lang.NoClassDefFoundError ex) { 
     System.out.println("Got it!"); 
    } 
    } 
} 

class Missing { 
    Missing() { } 
} 

Si ejecuta Strange1 y Strange2 después de eliminar Missing.class, Strange1 tirará NoClassDefFoundError; pero Strange2 lo imprimirá tengo!Tricky try-catch código java

¿Alguien puede explicar eso? Gracias.

actualización:

Java bytecode para Strange1:

 0 new info.liuxuan.test.Missing [16] 
    3 dup 
    4 invokespecial info.liuxuan.test.Missing() [18] 
    7 astore_1 [m] 
    8 goto 20 
    11 astore_1 [ex] 
    12 getstatic java.lang.System.out : java.io.PrintStream [19] 
    15 ldc <String "Got it!"> [25] 
    17 invokevirtual java.io.PrintStream.println(java.lang.String) : void [27] 
    20 return 
     Exception Table: 
     [pc: 0, pc: 8] -> 11 when : java.lang.NoClassDefFoundError 
     Line numbers: 
     [pc: 0, line: 14] 
     [pc: 11, line: 15] 
     [pc: 12, line: 16] 
     [pc: 20, line: 18] 
     Local variable table: 
     [pc: 0, pc: 21] local: args index: 0 type: java.lang.String[] 
     [pc: 8, pc: 11] local: m index: 1 type: info.liuxuan.test.Missing 
     [pc: 12, pc: 20] local: ex index: 1 type: java.lang.NoClassDefFoundError 

Java bytecode para Strange2:

 0 new info.liuxuan.test.Missing [16] 
    3 dup 
    4 invokespecial info.liuxuan.test.Missing() [18] 
    7 astore_1 [m] 
    8 goto 20 
    11 astore_2 [ex] 
    12 getstatic java.lang.System.out : java.io.PrintStream [19] 
    15 ldc <String "Got it!"> [25] 
    17 invokevirtual java.io.PrintStream.println(java.lang.String) : void [27] 
    20 return 
     Exception Table: 
     [pc: 0, pc: 8] -> 11 when : java.lang.NoClassDefFoundError 
     Line numbers: 
     [pc: 0, line: 15] 
     [pc: 11, line: 16] 
     [pc: 12, line: 17] 
     [pc: 20, line: 19] 
     Local variable table: 
     [pc: 0, pc: 21] local: args index: 0 type: java.lang.String[] 
     [pc: 8, pc: 11] local: m index: 1 type: info.liuxuan.test.Missing 
     [pc: 12, pc: 20] local: ex index: 2 type: java.lang.NoClassDefFoundError 

Hay un solo lugar es diferente:

11 astore_1 [ex] 

y

11 astore_2 [ex] 

actualizado de nuevo:

Todo el mundo puede intentarlo en eclipse.

+0

mira el código de bytes generado para ver la diferencia. – Thilo

+1

Ambos imprimen "¡Lo tengo!" para mi. –

+0

¿Qué quiere decir con "eliminar"? Ni siquiera debería compilarse si no está presente en tiempo de compilación. Por favor edite su pregunta para ser más específico. Además, el título no significa nada con respecto a la pregunta: ¿puede editarlo también para ser más específico? –

Respuesta

2

Antes de decir algo, dudo que este código ni siquiera compile. porque cuando el compilador no puede encontrar una clase (ya que es eliminada). Puede ser que esté recibiendo un error al intentar compilarlo usando el comando javac. si ese es el caso es bastante normal y de ninguna manera es extraño.

y permítanme agregar otro punto ... verifique sus importaciones, para contener Falta la clase. si está allí, luego quítalo. y dinos que esta pasando

+2

Esperaría que lo que diga sea cierto, pero parece que su experiencia es el comportamiento opuesto (todo en los comentarios no se cumple): la declaración de la variable uno queda atrapado. – dfb

+0

@spinning_plate .. lo siento amigo. De hecho, estaba equivocado. – ngesh

0

NoClassDefFoundError se lanza cada vez que se realiza la primera referencia (declarar o crear una instancia) a la clase que falta. Ahora, lanzar un error o atraparlo depende de si usa el bloque try-catch para su primera referencia o no.

1

Creé dos archivos java. Strange1.java contenía clases Strange1 y Missing. Strange2.java contenía la clase Strange2. Eliminé Missing.class. Tengo "¡Lo tengo!" de ambos.

Por favor ver los siguientes detalles:

[email protected]:~$ java -version 
java version "1.6.0_25" 
Java(TM) SE Runtime Environment (build 1.6.0_25-b06) 
Java HotSpot(TM) Server VM (build 20.0-b11, mixed mode) 
[email protected]:~$ gedit Strange1.java 
[email protected]:~$ gedit Strange2.java 
[email protected]:~$ javac Strange1.java 
[email protected]:~$ javac Strange2.java 
[email protected]:~$ java Strange1 
[email protected]:~$ java Strange2 
[email protected]:~$ rm Missing.class 
[email protected]:~$ java Strange1 
Got it! 
[email protected]:~$ java Strange2 
Got it! 

I ejecutados en Ubuntu 11.04 máquina Linux.

Así que podría ser la versión de Java que está utilizando.

+0

Lo probé en eclipse, por lo que puede intentarlo en eclipse. Pero lo que obtuve al comando es NoClassDefFoundError. He probado tanto JDK 1.5.0_06 como 1.6.0_23. – Foredoomed

+0

Yo también lo probé en Eclipse Helios y obtuve "¡Lo tengo!" como dije antes. –