Exception in thread "main" java.lang.NoClassDefFoundError: Test
のエラーの意味はなんでしょうか?
class Test{
public static void main(String args[]){
System.out.println("Hello");
}
}
コンパイルは成功し
java Test[enter]
に対して出ます。
実は僕の環境ではきちんと実行できます。
知り合いのコンピュータだと出来ないんです。
メールのやり取りですので、何が間違っているのか謎なんです。
おしえてください・・・
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
#3です。
>どちらも的確でない、ということです。
それは失礼致しました。
ご質問の「Exception in thread "main" java.lang.NoClassDefFoundError: Test
のエラーの意味はなんでしょうか? 」の答えですね。
通常のメソッド呼び出し、あるいは new 式を使った新しいインスタンスの生成で Java Virtual Machine またはクラスローダがクラス定義をロードしようとしたとき、クラス定義が見からない場合にスローされます。
検索されるクラス定義は、現在実行中のクラスをコンパイルする時点では存在していましたが、その後見つからなくなっています。
ちょっといらついてしまいました^_^;
申し訳ないです。
なんとなく自分側の不具合でないのでもどかしく、
確かにきちんとわかっていないこともあり、
多少自信もあったためイライラしてしまいました。
ところで、こんなページを見つけました
http://www.ytp.ne.jp/tech/java/sineruka/classpat …
ここの説明がわかりやすそうです。
じっくり勉強してみます。
ただ、今回の場合は、やはり設定内容も奇妙なことから、
(クラスパスもなにやら変なところにはいっていませんか?通常のpathもはいっていないようだし・・・)
path設定のやり直しで対応できそうです。
それにしてもよくあの設定でインタプリタが動いているなあ・・・
No.4
- 回答日時:
>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さんはこの方法を指定されたのだと思います。
最期に、、、
>専門家様ということで、出来ましたらわかりやすくお願いします。
このような書き込みは控えた方が宜しいかと。
この回答への補足
たくさんどうも。
>1)そもそも、Test.class が現在の作業ディレクトリに存在していない。
dirをさせましたが、CLASSファイルは生成できているようです。
>c:\Hoge>java -classpath . Test
えーと、これはだめでした。
同じエラーが出たようです。
>専門家様ということで、出来ましたらわかりやすくお願いします。
わからないから質問しているのに、
「わかってないんじゃないの?」
なんて言い方は、頭にきませんか?
それに、相当自信がおありのようですので。
わざわざありがとうございました
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]に対して
コマンドが見つかりません
のエラーにならないのか・・・??
No.3
- 回答日時:
自分も初学者に毛が生えた程度ですが、、、
パスというのはコマンドを探す基点のことです。
クラスパスというのはJavaのクラスファイルを探す基点のことです。
こう書けばぜんぜん違うということがわかって頂けますでしょうか?
だからパスを設定すればクラスパスは設定しなくてもいいということはありません。
まったくべつものであるからです。
参考書にはそのようなことは触れていないかもしれません。
確かに初学者用の参考書はアプレットについてであったり
クラス階層が単純であったり
コアAPIしか使わない場合があるので
とくにクラスパスを設定しなくても問題が生じないのです。
しかし、コアAPI以外のライブラリを使う、
自分でつくったものを他人に提供するとなると
どうしてもクラスパスを理解していないと
NoClassDefExceptionに悩まされることになるのです。
あと、環境によってやインストールしたアプリやIDE(統合開発環境)により
クラスパス設定は変わってきます。
IDEはカレントディレクトリを勝手にクラスパスに追加してくれるものが多いようです
もし環境によってちがうというのであれば
それぞれの環境でクラスパスを調べてみてください。
動くほうではカレントディレクトリに何らかの形でクラスパスが通っているはずです。
参考書にクラスパスについて書いていないというのは
どっちかというとそのレベルには達していない
もしくはその参考書が親切でないということだと思います。
また本に書いてあることがすべてではありません。
Javaは特に進化が早い言語のようで
最新情報は本を待っていては追いつかないです。
がんばってください。
この回答への補足
class Test{
public static void main(String args[]){
System.out.println("Hello");
}
}
このプログラムですよ・・・
普通動きますよね。
クラスパスなんか設定しなくても・・・
そこのところなんですよ。
ききたいのは。
あと、ちょっと、回答者の方の言い方がいやな感じで滝さん書き込んでしまいましたが、
>参考書にクラスパスについて書いていないというのは
どっちかというとそのレベルには達していない
もしくはその参考書が親切でないということだと思います。 また本に書いてあることがすべてではありません。
Javaは特に進化が早い言語のようで
最新情報は本を待っていては追いつかないです。
そんなことは重々承知ですよ^_^;
ただ、教えてくれたURLも然り。
どちらも的確でない、ということです。
さも、これがすべてだ、見たいな回答でしたので・・・
No.2
- 回答日時:
参考URLに初心者の助けとなるようなFAQがたくさんあります。
一度目を通してみてください。>へんですねえ・・・
>
>この程度のプログラムでクラスパスをとうす必要がある
>んでしょうか・・・?
へんでもなんでもありません。
CLASSPATHについて理解できていないのではありませんか?
参考URL:http://www.gimlay.org/~javafaq/S002.html#S002-08
この回答への補足
えーーと・・・
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を追加すればいいとしか書いていない現状で、クラスパスにドットがないのが原因だ、なんていわれても????となるのが当たり前だと思いますよ。
専門家様ということで、出来ましたらわかりやすくお願いします。
No.1
- 回答日時:
これは、よくあるエラーです。
おそらく、classpathが設定されていないのでは。
参考URLを順番に見てください。
コレ試してみてください。
java -classpath . Test
参考URL:http://www.atmarkit.co.jp/fjava/onepoint/index/i …
この回答への補足
へんですねえ・・・
この程度のプログラムでクラスパスをとうす必要があるんでしょうか・・・?
Javamail等のあとから追加したパッケージ(というんでしょうか?)を使ってるわけでもないのですが・・・?
単純にパス設定だけでいいはずですよね
Path c:\j2sdk1.4.1_01\bin
とautoexec.batに追加するだけですよねえ・・・
java[enter]
とした場合にはきちんとパスが通っているようでした。
すいません。
追加です。
java -classpath . WordProcessor
と入力するのと、
java WordProcessor
と書いてありますね・・・
とりあえずjava -classpath . Test
をやってみるようにいってみますが、
違うような気がします・・・・
ありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
(クラス名.this.メソッド)って...
-
関数内の変数に<summary>コメン...
-
親クラスから子クラスへアクセス。
-
型Containerのメソッドadd(S...
-
C#でほかのファイルにある自作...
-
SwingでgetContentPaneのエラー...
-
クラス間でのデータ参照
-
構造 他のクラスの構造体を別...
-
別ファイルのclassの読み込みに...
-
dllエクスポート時のdeclspec(d...
-
無名パッケージからのインポート
-
import と extends について
-
継承したクラス側のクラス名の取得
-
Java リフレクションについて
-
Class内で他のClassの定義
-
C++でfriendクラスにしているの...
-
c++,ある関数のクラスから別の...
-
[C#] OpenFileDialogによって得...
-
戻り値がクラスのときはどうす...
-
C# 可変長変数のやりとりについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
C#にて別クラスの関数を使いたい
-
import と extends について
-
c++,ある関数のクラスから別の...
-
C++でfriendクラスにしているの...
-
Java リフレクションについて
-
構造 他のクラスの構造体を別...
-
C#のクラスライブラリでメッセ...
-
無名パッケージからのインポート
-
親クラスから子クラスへアクセス。
-
Java
-
C# インターフェイスの実装
-
Tomcatのpropertiesファイルの...
-
C# log4netの使い方
-
ひとつのファイルにクラスは1つ?
-
dllエクスポート時のdeclspec(d...
-
a href="..." とServlet
-
実行可能jarファイルのファイル...
-
C#でほかのファイルにある自作...
おすすめ情報