2011-08-09 14 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() { } 
} 

Jeśli prowadzisz Strange1 i Strange2 po usunięciu Missing.class, Strange1 rzuci NoClassDefFoundError; ale Strange2 będzie drukować Got it!Tricky try-catch kod Java

Może ktoś wyjaśnić? Dzięki.

aktualizacja:

kodu bajtowego Java dla 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 

kodu bajtowego Java dla 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 

Jest tylko jedno miejsce, jest inna:

11 astore_1 [ex] 

i

11 astore_2 [ex] 

aktualizowane raz:

Każdy może spróbować go w Eclipse.

+0

spójrz na wygenerowany kod bajtowy, aby zobaczyć różnicę. – Thilo

+1

Oboje drukują "Got it!" dla mnie. –

+0

Co masz na myśli przez "usuń"? Nie powinien nawet kompilować, jeśli nie jest obecny podczas kompilacji. Zmień swoje pytanie, aby było bardziej szczegółowe. Tytuł również nie ma znaczenia w odniesieniu do pytania - czy możesz go również edytować? –

Odpowiedz

2

Przed powiedzeniem czegokolwiek, nie wątpię, że ten kod nie będzie się nawet kompilował. ponieważ gdy kompilator nie może znaleźć klasy (od czasu jej usunięcia). może być wyświetlany błąd podczas próby kompilacji przy użyciu polecenia javac. jeśli tak jest, to jest całkiem normalne iw żaden sposób nie jest dziwne.

i pozwól mi dodać kolejny punkt. Sprawdź swój import, aby zawrzeć Brakującą klasę. jeśli jest, usuń go. i powiedz nam, co się dzieje.

+2

Spodziewałbym się, że to, co mówisz, jest prawdą, ale wygląda na to, że doświadcza odwrotnego zachowania (wszystko w komentarzach) - deklaracja zmiennej, którą ktoś złapie. – dfb

+0

@spinning_plate .. sorry kumpel. faktycznie byłem w błędzie .. – ngesh

0

NoClassDefFoundError jest generowany za każdym razem, gdy pierwsze odwołanie (deklarowanie lub tworzenie instancji) do brakującej klasy jest wykonywane. Teraz rzucenie błędu lub złapanie go zależy od tego, czy używasz bloku try-catch dla pierwszego odniesienia, czy nie.

1

Utworzono dwa pliki Java. Strange1.java zawierał klasy Strange1 and Missing. Strange2.java zawierał klasę Strange2. Usunąłem Missing.class. Mam "Mam!" od obu.

proszę zobaczyć następujące informacje:

[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! 

wykonałem go w Ubuntu 11.04 maszynie Linux.

Może to być wersja Java, z której korzystasz.

+0

Próbowałem to w zaćmieniu, więc możesz spróbować w zaćmieniu. Ale to, co dostałem, to zarówno NoClassDefFoundError. Próbowałem zarówno JDK 1.5.0_06 i 1.6.0_23. – Foredoomed

+0

Też wypróbowałem to w Eclipse Helios też i dostałem "Dostałem to!" jak wspomniano wcześniej. –