- 締切済み
実行中にNoClassDefFoundErrorが発生する
初めて質問させていただきます。 Javaの実行中にNoClassDefFoundErrorが極稀に発生して困っています。 エラーは以下になります。 Exception in thread "Thread-12" java.lang.NoClassDefFoundError: パッケージ.Sample at パッケージ.問題発生クラス.run(問題発生クラス.java:71) 1.問題発生クラス.java:71でパッケージ.SampleをNewしています。 2.エラー内容からNewする時にNoClassDefFoundErrorが発生しているようです。 ただし、NoClassDefFoundErrorは数万回に一回でるかでないか。 ネットでも調べましたがコンパイル字のNoClassDefFoundErrorしか見つかりませんでした。 知恵をお貸しいただけないでしょうか よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- hofchan
- ベストアンサー率62% (17/27)
>継承しているクラスがなければ「NoClassDefFoundError」 >が投げられるという理解でよろしかったでしょうか これは違います、それでも例外は投げられるでしょうが クラスをロードしようとした時に、必要なクラスが無い 場合に投げられます、継承は関係ありません 以下流れを自分で実行すればわかります -------------------------------------------------- package test; public class Hello { public void say() { System.out.println("Hello"); } } -------------------------------------------------- package test; public class Test { public static void main(String args[]) { Hello h = new Hello(); h.say(); } } -------------------------------------------------- これを適当にコンパイルして、実行します java test.Test とすれば当然に Hello と出力されますが test/Hello.class を削除してから実行すれば java.lang.NoClassDefFoundError を投げます 継承していても、していなくても ロードするべきクラスがなければ例外です パスを通してコンパイルしたけど、実行時には パスが通って無いなど色々です
- choconamacream
- ベストアンサー率44% (152/338)
困った時の「APIドキュメント」。とりあえずは覗いてみる。 java.lang クラス NoClassDefFoundError http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/NoClassDefFoundError.html 案の定、あのいつもの紫色のトーンで何が何だかもう。 ただ、「ClassLoader インスタンス」という言葉を発見。すかさず、googleにて[NoClassDefFoundError ClassLoader Java]でググってみる。 下の方でやっとIBMのサイトを発見。 developerWork > Java technology > クラス・ローディング問題の神秘を解く 第2回: クラス・ローディングに関する基本的な例外 クラス・ローディングに関する単純な問題と難問を詳しく調べる http://www-06.ibm.com/jp/developerworks/java/060127/j_j-dclp2.shtml 上記のサイトにて、IBM Hursley Labsの方々が以下のように述べています。 「(前略)クラスAはクラスBを継承しています。そのためクラスAがロードされると、クラス・ローダーは暗黙的にクラスBをロードします。クラスBは存在しないため、NoClassDefFoundErrorが投げられます。」
- PED02744
- ベストアンサー率40% (157/390)
ごくまれに・・・っていうのがなぞですよね。。 NoClassDefFoundError は、コンパイル時にはあったけど実行しようとしたら消えた場合にも発生するようです。 http://blog.goo.ne.jp/evergreen_1978/e/a04acf1cc67d85d1540771f731fa2651 一応、googleで[実行中 NoClassDefFoundError]で調べてみました。 複数の人で同じサーバ環境を使ってデバッグをしていて、 たまに他の人が使っているかどうかの確認もせずモジュールを置き換える人がいる ・・・って所ではないでしょうか。
補足
PED02744様 回答ありがとうございます。 「コンパイル時にはあったけど実行しようとしたら消えた場合」というのは 実行しようとしたらクラスファイルがなかったと言うことでよかったでしょうか? Javaを実行しているサーバは自分しか使えない環境ですので 他の人が置き換えるというのは起こらないです。 ごくまれにってなんなんでしょうね。。。
補足
choconamacream様 回答ありがとうございます。 http://www-06.ibm.com/jp/developerworks/java/060127/j_j-dclp2.shtml を読みました。 継承しているクラスがなければ「NoClassDefFoundError」が投げられるという理解でよろしかったでしょうか 上記の理解でよければ毎回エラーが投げられると思います。