18

1 つの静的ブロックを持つ単純なクラスを作成しました

class Hello
{

  static {
           System.out.println("Hello");
       System.exit(0);
     }
}

jdk1.5を使用して実行すると、静的ブロックが実行されます

C:\apps\Java\jdk1.5.0_21\bin>javac Hello.java

C:\apps\Java\jdk1.5.0_21\bin>
C:\apps\Java\jdk1.5.0_21\bin>
C:\apps\Java\jdk1.5.0_21\bin>
C:\apps\Java\jdk1.5.0_21\bin>java Hello

Hello

しかし、jdk1.7を使用して実行すると、次のエラーが発生します

C:\Program Files (x86)\Java\jdk1.7.0_02\bin>
C:\Program Files (x86)\Java\jdk1.7.0_02\bin>javac Hello.java

C:\Program Files (x86)\Java\jdk1.7.0_02\bin>java Hello
Error: Main method not found in class Hello, please define the main method as:
    public static void main(String[] args)

JDK 5 および JDK 7 でのこの動作の変更について、だれか思い当たることはありますか?

前もって感謝します!!

4

9 に答える 9

6

JLS 12.1を実行します。

Java 仮想マシンは、指定されたクラスの main メソッドを呼び出して実行を開始し、文字列の配列である単一の引数を渡します。この仕様の例では、この最初のクラスは通常 Test と呼ばれます。

クラス Test のメソッド main を最初に実行しようとすると、クラス Test がロードされていないことがわかります。つまり、Java 仮想マシンには現在、このクラスのバイナリ表現が含まれていません。次に、Java 仮想マシンはクラスローダーを使用して、そのようなバイナリ表現を見つけようとします。

public static main(String[] args)クラスをロードしてからメソッドを探す Java 6 とは異なり、Java 7はアプリケーションのエントリ ポイントであるメソッドを探してからクラスをロードしますmain

于 2013-07-06T07:00:01.027 に答える
3

public static void main(String[] args){ }おそらくJDK7のクラスにメソッドを入れる必要があります。JDK7 では、静的ブロックの前に main メソッドの存在がチェックされ、見つからない場合は例外が発生します。

于 2013-07-06T06:49:15.767 に答える
1

JLS Chapter 12 (バージョン 5 または 7) を注意深く読んだ場合、「メイン」クラスの静的初期化がいつ発生するかは指定されていません。実際、これについて不平を言うバグ レポートがあります。

指定されているのは、エントリ ポイント メソッドが呼び出される前に「メイン」クラスが初期化される (そして静的初期化子が実行される) ことです。それはJLS 12.4.1で指定されています

彼らがこれを変更した理由を説明したり、変更を文書化した場所を見つけたりすることはできません。しかし、どうやらそれ変わったようです。本当の説明が必要な場合は、担当の Sun / Oracle エンジニアに尋ねる必要があります。

(FWIW、これは良い変更だと思います。静的な初期化が行われ、エントリポイントが見つからないためにプログラムが失敗することは予期しない動作であり、正当な理由がない場合、予期しないことは悪いことです。)

于 2013-07-06T07:43:56.583 に答える
0

JDK1.6まで:-

最初にクラスをロードし、クラスのロード中に静的ブロックが実行されます。次に、実行するメイン メソッドを確認します。

JDK1.7以降:

main メソッドが使用可能かどうかを最初にチェックします。

if available
   then first execute static and
   then main method will be executed.

if not available
throw error 
于 2014-08-07T07:05:43.117 に答える