クラス名とファイル名を別名にしコンパイル→実行した結果、以下のエラーがでました。
なぜ、エラーがでるのか教えてください。
また。どなたか一行づつ以下のエラー内容を解説ができる方はおられませんか?
ご教授ください。
※エラーの解説は一部でも構いません。
Exception in thread "main" java.lang.NoClassDefFoundError: classHelloWor
Caused by: java.lang.ClassNotFoundException: classHelloWorld
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
→?
Could not find the main class: classHelloWorld. Program will exit.
→ classHelloworldを見つけることができない?
回答 No.4 の続きです。
1.
ネイティブコードとNative Methodは別物です。
2.
ネイティブコードとはコンピュータが直接実行可能な機械語です。
ネイティブコードはCPU仕様に依存しています。
3.
ネイティブコードを実行する方式は以下の2通りがあります。
《方式 X 》
JavaVMがバイトコードをネイティブコードに変換して実行する。
→Javaのメソッド
《方式 Y 》
コンパイラがC言語で書かれたソースコードからネイティブコードに変換する。
JavaVMがこのネイティブコードを呼び出す。
→Native Method
publicクラスはファイル名とクラス名を同じにしないといけません。
(コンパイラおよびjavaの仕様です。ファイル名のクラスを探しにいって
見つかりませんと言っています)
実行するポイントである main メソッドを持つクラスは public でなければなりません。
また、public であるクラスはファイル名とクラス名が一致している必要があります。
classHelloWorld という名前のクラスであれば以下のようになります。
ファイル名: classHelloWorld.java
クラスの定義: public class classHelloWorld {...}
NoClassDefFoundError はクラスが見つからないというエラーです。
実行時にはコンパイル済みのクラスが配置されているディレクトリを java コマンドの -cp または -classpath オプションで指定します。
●発生原因
以下のようなとき、エラーが発生します。
1. class ファイルが存在しない。
2. 実行するとき、 class ファイルが存在するフォルダを classpath に指定していない。
NoClassDefFoundError (Java Platform SE 6) - http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/NoClassDef...
「Java 仮想マシンまたは ClassLoader インスタンスがクラス定義をロードしようとしたが、クラス定義が見からない場合にスローされます。」
Javaの道>掲示板(実行時のNoClassDefFoundErrorについて) - http://www.javaroad.jp/bbs/answer.jsp?q_id=2005111613514712
●エラー内容
エラーメッセージ1,2行目は
1. エラーが発生した。
2. 発生したスレッドの名前は"main"である。
3. エラーの種類はjava.lang.NoClassDefFoundErrorである。
4. classHelloWorldという名前のクラスが見つからなかった。
エラーメッセージ3行目以降は、エラーがプログラムのどの箇所で発生したかを告げています。
「at java.net.URLClassLoader$1.run」は「java.net.URLClassLoader$1クラスのrunメソッド」、
「(Unknown Source)」は「ソースファイル名を特定できない」、
「(Native Method)」は「Javaのメソッドではなく、ネイティブメソッドである」ことを意味します。
この NoClassDefFoundError の場合、Java VM(Java仮想マシン)の内部で発生したエラーです。
自分が作ったプログラムを動かすことが目的であれば、エラーメッセージ1行目だけ読めば
Java VM起動引数を見直すべきと分かりますので、エラーメッセージ3行目以降は
深入りする必要はないでしょう。
回答 No.4 の続きです。
1.
ネイティブコードとNative Methodは別物です。
2.
ネイティブコードとはコンピュータが直接実行可能な機械語です。
ネイティブコードはCPU仕様に依存しています。
3.
ネイティブコードを実行する方式は以下の2通りがあります。
《方式 X 》
JavaVMがバイトコードをネイティブコードに変換して実行する。
→Javaのメソッド
《方式 Y 》
コンパイラがC言語で書かれたソースコードからネイティブコードに変換する。
JavaVMがこのネイティブコードを呼び出す。
→Native Method
ご回答ありがとうございます。ただ、よくネイティブコードと耳にします。
その存在も仕組みも良くわかりません。すみませんが、ご教授願えないでしょうか?
・native Methodとは具体的になんでしょうか?
→ C言語で記述されたソースなんでしょうか?(VMを通さないで、OS依存による機械語のことでしょうか?)