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

あなたがMissing.classを削除した後Strange1とStrange2を実行した場合、Strange1はNoClassDefFoundError;がスローされますが、Strange2は、ガットそれを印刷します!トリッキーのtry-catch Javaコード

誰もがそれを説明できますか?ありがとう。

は更新:

Javaバイトコード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バイトコードStrange2用:

11 astore_1 [ex] 

 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 

は、唯一の場所が異なる場合があります

11 astore_2 [ex] 

は再び更新:

誰も日食でそれを試すことができます。

+0

生成されたバイトコードを見て違いを確認してください。 – Thilo

+1

彼らは両方とも "Got it!"私のために。 –

+0

「削除」とはどういう意味ですか?コンパイル時に存在しない場合でもコンパイルすべきではありません。より具体的に質問を編集してください。また、タイトルは質問に関する何かを意味するものではなく、さらに具体的に編集することはできますか? –

答えて

2

何かを言う前に、私はこのコードをコンパイルしてもいけません。なぜなら、コンパイラがクラスを見つけられないとき(それが削除されて以来)です。 javacコマンドを使用してコンパイルしようとしたときにエラーが発生している可能性があります。もしそれがかなり正常で、決してその奇妙なものではないならば。

他のポイントを追加してください。が含まれていることをご確認ください。クラスがありません。それがあればそれを取り除く。起こっていることを教えてください。

+2

私はあなたの言うことが真実だと思っていますが、彼は反対の行動(コメントの中のすべてが非耐性)の経験であるように見えます - 変数宣言が捕まえられます。 – dfb

+0

@ spinning_plate ..ごめんなさい。実際に私は間違っていた。 – ngesh

0

NoClassDefFoundErrorは、欠落しているクラスへの最初の参照(インスタンスの宣言または作成)が行われるたびにスローされます。さて、エラーを投げたり、キャッチするのは、あなたの最初の参照にtry-catchブロックを使用するかどうかによって異なります。

1

私は2つのJavaファイルを作成しました。 Strange1.javaにはStrange1クラスとMissingクラスが含まれていました。 Strange2.javaにはStrange2クラスが含まれていました。 Missing.classを削除しました。 「得ました!」両方から。

以下の詳細をご覧ください。

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

私はUbuntuの11.04 Linuxマシンでそれを実行します。

これは、使用しているJavaのバージョンかもしれません。

+0

私は日食で試したので、あなたは日食で試してみることがあります。しかし、私がコマンドで得たのは、NoClassDefFoundErrorです。私はJDK 1.5.0_06と1.6.0_23の両方を試しました。 – Foredoomed

+0

私もEclipse Heliosで試してみましたが、「得ました!」以前のように。 –

関連する問題