アプリ版:「スタンプのみでお礼する」機能のリリースについて

初めて質問させていただきます。

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しか見つかりませんでした。

知恵をお貸しいただけないでしょうか
よろしくお願いいたします。

A 回答 (3件)

>継承しているクラスがなければ「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 を投げます

継承していても、していなくても
ロードするべきクラスがなければ例外です
パスを通してコンパイルしたけど、実行時には
パスが通って無いなど色々です
    • good
    • 0

困った時の「APIドキュメント」。

とりあえずは覗いてみる。

java.lang
クラス NoClassDefFoundError
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/ja …

案の定、あのいつもの紫色のトーンで何が何だかもう。

ただ、「ClassLoader インスタンス」という言葉を発見。すかさず、googleにて[NoClassDefFoundError ClassLoader Java]でググってみる。

下の方でやっとIBMのサイトを発見。

developerWork > Java technology >
クラス・ローディング問題の神秘を解く 第2回: クラス・ローディングに関する基本的な例外
クラス・ローディングに関する単純な問題と難問を詳しく調べる
http://www-06.ibm.com/jp/developerworks/java/060 …

上記のサイトにて、IBM Hursley Labsの方々が以下のように述べています。

「(前略)クラスAはクラスBを継承しています。そのためクラスAがロードされると、クラス・ローダーは暗黙的にクラスBをロードします。クラスBは存在しないため、NoClassDefFoundErrorが投げられます。」

この回答への補足

choconamacream様
回答ありがとうございます。

http://www-06.ibm.com/jp/developerworks/java/060 …
を読みました。
継承しているクラスがなければ「NoClassDefFoundError」が投げられるという理解でよろしかったでしょうか

上記の理解でよければ毎回エラーが投げられると思います。

補足日時:2007/08/06 09:02
    • good
    • 0

ごくまれに・・・っていうのがなぞですよね。


NoClassDefFoundError は、コンパイル時にはあったけど実行しようとしたら消えた場合にも発生するようです。
http://blog.goo.ne.jp/evergreen_1978/e/a04acf1cc …
一応、googleで[実行中 NoClassDefFoundError]で調べてみました。

複数の人で同じサーバ環境を使ってデバッグをしていて、
たまに他の人が使っているかどうかの確認もせずモジュールを置き換える人がいる
・・・って所ではないでしょうか。

この回答への補足

PED02744様
回答ありがとうございます。

「コンパイル時にはあったけど実行しようとしたら消えた場合」というのは
実行しようとしたらクラスファイルがなかったと言うことでよかったでしょうか?

Javaを実行しているサーバは自分しか使えない環境ですので
他の人が置き換えるというのは起こらないです。

ごくまれにってなんなんでしょうね。。。

補足日時:2007/08/06 08:52
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!