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

Nếu bạn chạy Strange1 và Strange2 sau khi xóa Missing.class, Strange1 sẽ ném NoClassDefFoundError; nhưng Strange2 sẽ in Got it!Tricky try-catch java đang

thể bất cứ ai giải thích điều đó không? Cảm ơn.

Cập nhật:

java bytecode cho 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 cho 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 

Chỉ có một nơi là khác nhau:

11 astore_1 [ex] 

11 astore_2 [ex] 

được cập nhật một lần nữa:

Mọi người có thể thử nó trong nhật thực.

+0

xem mã byte được tạo để thấy sự khác biệt. – Thilo

+1

Cả hai đều in "OK!" cho tôi. –

+0

Bạn có ý gì khi "xóa"? Nó thậm chí không nên biên dịch nếu nó không có mặt tại thời gian biên dịch. Vui lòng chỉnh sửa câu hỏi của bạn để cụ thể hơn. Ngoài ra, tiêu đề không có nghĩa là bất kỳ điều gì liên quan đến câu hỏi - bạn có thể chỉnh sửa tiêu đề đó để cụ thể hơn không? –

Trả lời

2

Trước khi nói bất cứ điều gì, tôi không chắc mã này sẽ không biên dịch. bởi vì khi trình biên dịch không thể tìm thấy một lớp (Kể từ khi nó bị xóa). có thể bạn đang gặp lỗi khi cố biên dịch bằng lệnh javac. nếu đó là trường hợp của nó khá bình thường và không có cách nào lạ của nó.

và để tôi thêm một điểm khác .. kiểm tra hàng nhập của bạn, để chứa Thiếu lớp. nếu nó ở đó thì loại bỏ nó. và cho chúng tôi biết điều gì đang xảy ra.

+2

Tôi mong đợi những gì bạn nói là đúng, nhưng có vẻ như anh ta đang trải nghiệm hành vi ngược lại (mọi thứ trong những bình luận không tồn tại) - một tuyên bố biến không bị bắt. – dfb

+0

@spinning_plate .. xin lỗi bạn thân. thực sự tôi đã sai .. – ngesh

0

NoClassDefFoundError được ném bất cứ khi nào tham chiếu đầu tiên (khai báo hoặc tạo một thể hiện) cho lớp bị thiếu được thực hiện. Bây giờ, ném một lỗi hoặc bắt nó phụ thuộc vào việc bạn sử dụng khối try-catch cho tham chiếu đầu tiên của bạn hay không.

1

Tôi đã tạo hai tệp java. Strange1.java chứa các lớp Strange1 và Missing. Strange2.java chứa lớp Strange2. Tôi đã xóa Missing.class. Tôi đã nhận được "OK!" từ cả hai.

Xin vui lòng xem các nội dung sau:

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

tôi thực hiện nó trong Ubuntu 11.04 máy Linux.

Vì vậy, nó có thể là phiên bản java mà bạn đang sử dụng.

+0

Tôi đã thử nó trong nhật thực, vì vậy bạn có thể có một thử trong nhật thực. Nhưng những gì tôi nhận được trong lệnh là cả NoClassDefFoundError. Tôi đã thử cả JDK 1.5.0_06 và 1.6.0_23. – Foredoomed

+0

Tôi cũng đã thử nó trong Eclipse Helios và tôi đã nhận được "Got it!" như đã nói trước đó. –

Các vấn đề liên quan