- 締切済み
妙なエラー
Exception in thread "main" java.lang.NoClassDefFoundError: Test のエラーの意味はなんでしょうか? class Test{ public static void main(String args[]){ System.out.println("Hello"); } } コンパイルは成功し java Test[enter] に対して出ます。 実は僕の環境ではきちんと実行できます。 知り合いのコンピュータだと出来ないんです。 メールのやり取りですので、何が間違っているのか謎なんです。 おしえてください・・・
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- chi-kon
- ベストアンサー率43% (58/132)
#3です。 >どちらも的確でない、ということです。 それは失礼致しました。 ご質問の「Exception in thread "main" java.lang.NoClassDefFoundError: Test のエラーの意味はなんでしょうか? 」の答えですね。 通常のメソッド呼び出し、あるいは new 式を使った新しいインスタンスの生成で Java Virtual Machine またはクラスローダがクラス定義をロードしようとしたとき、クラス定義が見からない場合にスローされます。 検索されるクラス定義は、現在実行中のクラスをコンパイルする時点では存在していましたが、その後見つからなくなっています。
- takaP-
- ベストアンサー率79% (83/105)
>Exception in thread "main" java.lang.NoClassDefFoundError: Test 上のエラーが出てくるという事は、少なくとも JavaVM が「Test」というクラスを見つけられないわけです。 c:\Hoge>java Test azicyanさんが上記のコマンド操作で Test.class を実行できたという事は Test.class が C:\Hoge ディレクトリに置かれている、もしくはクラスパスの設定が Test.class が置かれているディレクトリに設定されているという事になります。 azicyanさんが「いっさいクラスパス等を設定していない」と仰っていますから、これは JavaVM のデフォルト設定「作業ディレクトリからクラスを検索」の働きによるものです。 JavaVM の場合、環境変数にクラスパスの設定がなされていない場合には作業ディレクトリを基底クラスパスとしてクラスを検索するという仕組みになっています。 ですから「何も設定されていない」場合には作業ディレクトリに目的のクラスさえあれば JavaVM がそのクラスを見つけ出す事が可能です。 で「友人」の場合は、これが上手く行かないのですよね? その理由ですが幾つかの可能性が考えられます。 1)そもそも、Test.class が現在の作業ディレクトリに存在していない。 馬鹿馬鹿しいですが、実は結構在り得る話です(笑 dir コマンドで、ディレクトリ内に在るかどうか調べさせてみましょう。 c:\Hoge>dir Test.class 「ファイルがみつかりません」と出ればファイルが存在しないという事です。 Test.class と思っていたのが実は test.class だったりとか大文字・小文字のスペル間違いも有り得ますので、その辺の注意も必要ですね(コンパイルは成功しているので可能性としては低いですけど) 次に、ある可能性としては、、、 2)環境変数に何某かのクラスパスが設定されてしまっている。 という可能性です。 これは自分では何もしていないと思っていても、#3さんが仰るように「何かのインストール時に勝手に書きかえられている」可能性も在り得るのです。 書きかえられていて、且つカレントディレクトリ「.」(現在の作業ディレクトリ)がクラスパスに含まれていないと、、 c:\Hoge>java Test としても、Test.class を見つけ出す事が不可能になります。 取り敢えず、、、、 c:\Hoge>set としてみて、表示される環境変数にクラスパスが記述されていないか調べさせてみて下さい。 クラスパスが設定されていて、且つ、「.」が無い場合には autoexec.bat ファイルのクラスパスに「.」を追加してやる必要があります(そして再起動も忘れずに) これは根本的な解決法であり、一時的にカレントディレクトリをクラスパスを指定してあげる方法もあります。 c:\Hoge>java -classpath . Test 最初に#1さんが指摘した方法ですね。 下手に環境変数をいじる前に、取り敢えず確認という場合には最善の方法でしょうね、これが。 恐らく、その辺も踏まえて#1さんはこの方法を指定されたのだと思います。 最期に、、、 >専門家様ということで、出来ましたらわかりやすくお願いします。 このような書き込みは控えた方が宜しいかと。
お礼
BATファイルを送ってもらいました @ECHO OFF CLS REM [Header] loadhigh c:\windows\COMMAND\nlsfunc.exe c:\windows\country.sys REM [CD-ROM Drive] rem mscdex.exe /D:OEMCD001 REM [Miscellaneous] REM [Display] REM [Sound, MIDI, or Video Capture Card] REM [Mouse] PATH C:\BITWARE\ @SET CLASSPATH=C:\PROGRA~1\PHOTOD~1.1\ADOBEC~1 かなり奇妙です・・・ よくこれでjava[enter]に対して コマンドが見つかりません のエラーにならないのか・・・??
補足
たくさんどうも。 >1)そもそも、Test.class が現在の作業ディレクトリに存在していない。 dirをさせましたが、CLASSファイルは生成できているようです。 >c:\Hoge>java -classpath . Test えーと、これはだめでした。 同じエラーが出たようです。 >専門家様ということで、出来ましたらわかりやすくお願いします。 わからないから質問しているのに、 「わかってないんじゃないの?」 なんて言い方は、頭にきませんか? それに、相当自信がおありのようですので。 わざわざありがとうございました
- chi-kon
- ベストアンサー率43% (58/132)
自分も初学者に毛が生えた程度ですが、、、 パスというのはコマンドを探す基点のことです。 クラスパスというのはJavaのクラスファイルを探す基点のことです。 こう書けばぜんぜん違うということがわかって頂けますでしょうか? だからパスを設定すればクラスパスは設定しなくてもいいということはありません。 まったくべつものであるからです。 参考書にはそのようなことは触れていないかもしれません。 確かに初学者用の参考書はアプレットについてであったり クラス階層が単純であったり コアAPIしか使わない場合があるので とくにクラスパスを設定しなくても問題が生じないのです。 しかし、コアAPI以外のライブラリを使う、 自分でつくったものを他人に提供するとなると どうしてもクラスパスを理解していないと NoClassDefExceptionに悩まされることになるのです。 あと、環境によってやインストールしたアプリやIDE(統合開発環境)により クラスパス設定は変わってきます。 IDEはカレントディレクトリを勝手にクラスパスに追加してくれるものが多いようです もし環境によってちがうというのであれば それぞれの環境でクラスパスを調べてみてください。 動くほうではカレントディレクトリに何らかの形でクラスパスが通っているはずです。 参考書にクラスパスについて書いていないというのは どっちかというとそのレベルには達していない もしくはその参考書が親切でないということだと思います。 また本に書いてあることがすべてではありません。 Javaは特に進化が早い言語のようで 最新情報は本を待っていては追いつかないです。 がんばってください。
補足
class Test{ public static void main(String args[]){ System.out.println("Hello"); } } このプログラムですよ・・・ 普通動きますよね。 クラスパスなんか設定しなくても・・・ そこのところなんですよ。 ききたいのは。 あと、ちょっと、回答者の方の言い方がいやな感じで滝さん書き込んでしまいましたが、 >参考書にクラスパスについて書いていないというのは どっちかというとそのレベルには達していない もしくはその参考書が親切でないということだと思います。 また本に書いてあることがすべてではありません。 Javaは特に進化が早い言語のようで 最新情報は本を待っていては追いつかないです。 そんなことは重々承知ですよ^_^; ただ、教えてくれたURLも然り。 どちらも的確でない、ということです。 さも、これがすべてだ、見たいな回答でしたので・・・
- yuji
- ベストアンサー率37% (64/169)
参考URLに初心者の助けとなるようなFAQがたくさんあります。一度目を通してみてください。 >へんですねえ・・・ > >この程度のプログラムでクラスパスをとうす必要がある >んでしょうか・・・? へんでもなんでもありません。 CLASSPATHについて理解できていないのではありませんか?
補足
えーーと・・・ CLASSPATHとpath設定は違うものだと思っていました。 (完全に違うという意味でなくて) CLASSPATHは通常JAVAMAIL等を追加したときにそのファイルに設定するものと理解していました。 間違っていますか? とりあえず標準的なものをコンパイルするには、 autoexec.bat のPATHのぎょうに ;c:jdk1.3\bin を追加 これで行くはずですよね? というかこれで、クラスパスとやらも同時に通ったことになっているのでは? たとえば、僕はJavamailを使うために そのとき初めてクラスパスを設定しましたが、 それは新たにDLしたmail.Jarファイル(この中にクラスファイルがあるのでしょうか?)が見つけられるようにクラスパスを通すんだな、と理解しました。 >CLASSPATHについて理解できていないのではありませんか? そういわれてしまうと、ちゃんとわかっていないといえるかも知れないですね。 というのも、どんなテキストにも、初期段階として、パス設定は書いてあっても(つまり上に書いたことです)クラスパス設定しましょう、とは書いていないからです。 現に僕も"クラスパス”設定とやらは、Javamailを使う段階になってしましたし、その前段階では、上に書いたことのようにすれば(PATHに追加)コンパイルも通過し実行できていたんですが(出来ないのはその人の環境で、僕の環境では通りますが)・・・?? 何度もいうようですが、CLASSPATH環境変数、なんて書いてありますが、最近の参考書を見て勉強している人はCLASSPATH環境変数の設定なんて個別にしていないですよ。 >これでうまくいくならば CLASSPATH環境変数の 設定に . (ドット、ピリオド)がないのが原因です。 と書いてあるんですが、 PATH設定にはドットもピリオドも必要なく、 初学者には?????? となるとおもいますよ。 僕もその人のパソコンの環境を実際触りながら見たわけじゃないので、どこか間違ってるかもしれないのですが、 最近の本には autoexec.bat のPATHのぎょうに ;c:jdk1.3\bin を追加 としか書いてないことが多く、参考のURLのように >これでうまくいくならば CLASSPATH環境変数の 設定に . (ドット、ピリオド)がないのが原因です。 といわれても?????? となると思いますよ。 だって、そういう本(いわゆる初心者本)を見て勉強していると「CLASSPATH環境変数の設定に . (ドット、ピリオド)」なんて作業一切必要ないですから。 >この程度のプログラムでクラスパスをとうす必要がある >んでしょうか・・・? あくまでも、BINにパスを通した後、さらにクラスパスを通す必要があるのか?という意味で書いたのですが。 >CLASSPATHについて理解できていないのではありませんか? すみません。 逆にお聞きしますが (1)僕が、「CLASSPATH環境変数の設定に . (ドット、ピリオド)」とかいう作業はしていないでpathにc:\jdk1.3\binを追加しただけでコンパイル、実行が出来たのはなぜですか? (2)JAVAで開発する際標準的な機能は前述したPATH設定でよく、追加する場合にCLASSPATHとして、新しいクラスにパスを通す必要がある。 見解は間違っていますか? (3)>この程度のプログラムでクラスパスをとうす必要がある >んでしょうか・・・? へんでもなんでもありません。 CLASSPATHについて理解できていないのではありませんか? 本に書いてあるとおりpath設定しているのに実行できない。「へんでもなんでもありません」ということはないと思いますが・・・。 では、ほとんどの初心者本に載っていない「CLASSPATHについて」自信があるとのことですので、初心者にわかりやすいように教えてください。 (4)上述した理由で、このFAQは初学者には混乱を増すだけと思われます。 理解力がない初学者が悪いのですか? 大抵の本に、AUTOEXEC.batにc:\jdk1.3\binを追加すればいいとしか書いていない現状で、クラスパスにドットがないのが原因だ、なんていわれても????となるのが当たり前だと思いますよ。 専門家様ということで、出来ましたらわかりやすくお願いします。
- dietnma2
- ベストアンサー率36% (7/19)
これは、よくあるエラーです。 おそらく、classpathが設定されていないのでは。 参考URLを順番に見てください。 コレ試してみてください。 java -classpath . Test
お礼
すいません。 追加です。 java -classpath . WordProcessor と入力するのと、 java WordProcessor と書いてありますね・・・ とりあえずjava -classpath . Test をやってみるようにいってみますが、 違うような気がします・・・・ ありがとうございました
補足
へんですねえ・・・ この程度のプログラムでクラスパスをとうす必要があるんでしょうか・・・? Javamail等のあとから追加したパッケージ(というんでしょうか?)を使ってるわけでもないのですが・・・? 単純にパス設定だけでいいはずですよね Path c:\j2sdk1.4.1_01\bin とautoexec.batに追加するだけですよねえ・・・ java[enter] とした場合にはきちんとパスが通っているようでした。
お礼
ちょっといらついてしまいました^_^; 申し訳ないです。 なんとなく自分側の不具合でないのでもどかしく、 確かにきちんとわかっていないこともあり、 多少自信もあったためイライラしてしまいました。 ところで、こんなページを見つけました http://www.ytp.ne.jp/tech/java/sineruka/classpath.html ここの説明がわかりやすそうです。 じっくり勉強してみます。 ただ、今回の場合は、やはり設定内容も奇妙なことから、 (クラスパスもなにやら変なところにはいっていませんか?通常のpathもはいっていないようだし・・・) path設定のやり直しで対応できそうです。 それにしてもよくあの設定でインタプリタが動いているなあ・・・