1

Windowsのコマンドラインから非常に単純な1つのクラスの「HelloWorld」プログラムを実行しようとしています。

この.javaファイルは「C:\ Users \ UserName \ Desktop\direcName」にあります。パッケージはdeemで、クラス名はtestです。

ディレクトリにcdして、そこからを使用してコンパイルできます。これjavac test.javaは完全に正常に機能します。ただし、次を使用して実行しようとすると、次のようになります。

java testまたはjava -classpath directory testjava -cp . test 「スレッドの例外」をスローしますmain java.lang.NoClassDefFoundError: test (wrong name: deem/test)

Javaを使用すると、次のように表示deem.testされます。Error, could not find or load main class deem.main

例外を修正してプログラムを実行するにはどうすればよいですか?

ありがとう

4

2 に答える 2

5

これは、コマンド ラインから Java プログラムを実行する際の「一般的な初心者エラー」のバリエーションです。

java test または java -classpath ディレクトリ test または java -cp 。テストすると、「スレッドメイン java.lang.NoClassDefFoundError で例外: テスト (間違った名前: deem/test) がスローされます。

JVM は実際には、検索パスに「test.class」が見つかったことを通知していますが、クラス ファイルを読み取ると、ファイルは「./deem/test.class」または「directory/deem/」にあるはずであると結論付けました。 test.class」...実際に使用した「-cp」/「-classpath」引数に応じて

java deem.test を使用すると、「エラー、メイン クラス deem.main が見つからないかロードできませんでした」と表示されます

これは、「deem/main.class」が見つからないことを示しています。

「test」または「deem.test」の代わりに「deem.main」というクラスを探すように指示したことに注意してください。(または、そこに何かを間違って転記しただけかもしれません。)

ルールは実に単純です。

  1. オプションの後の最初の引数として、完全修飾クラス名を指定する必要があります。java(単純なクラス名ではありません。 . class 」ファイル名ではありません。エントリ ポイント メソッドの名前ではありません。)
  2. javaコマンドが実行できる ように、クラスパスを指定する必要があります。
    • クラス名をクラス ファイルの相対パス名にマップします (例:foo.bar.baz.MyClassにマップしますfoo/bar/baz/MyClass.class) ...
    • 次に、その相対パスをクラスパス エントリの 1 つに対して解決します。たとえば、.がクラスパスの場合、./foo/bar/baz/MyClass.class.
  3. クラスには、必要なpublic static void main(String[])エントリ ポイント メソッドが必要です。

だからもし...

  1. クラスの完全修飾クラス名はdeem.test; つまり、testクラスはパッケージ内にありdeemかつ
  2. 対応するクラス ファイルは にあり./deem/test.classかつ
  3. 必要なエントリ ポイント メソッドがあり、かつ
  4. テストアプリケーションは、あなたの他のクラスやサードパーティのライブラリに依存していません...

その後、 java -cp . deem.test動作するはずです。

于 2012-10-08T01:54:07.903 に答える
1

クラスがパッケージ「deem」にある場合は、このようにパッケージ名を含める必要があります。

java deem.test

それはうまくいくはずです。

于 2012-10-08T00:20:48.153 に答える