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]
và
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.
xem mã byte được tạo để thấy sự khác biệt. – Thilo
Cả hai đều in "OK!" cho tôi. –
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? –