- ベストアンサー
NotClassDefFoundExceptionについて
はじめまして。 Javaの例外処理についてお聞きします。 例外クラスの中の 「 NotClassDefFoundException 」 というclassファイルが無い場合の例外処理を行いたいのですがどの部分を「try文」でくくればいいのでしょうか。最初はインスタンス化する所かと思ったのですが、上手くいきません。関連する事なら何でもいいので、回答よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.1,2のものです。 No.3の方が行っているようなことを私の方でも試してみましたが確かに実行前の段階で発生しますね。 実行前にクラスローディングされる段階でErrorとして(Exceptionではなく)発生するので。 Error:JavaVMからシステム経由で出力 Exception:実行時にでたエラーを出力 基本的には今回のケースのようにクラスをロストさせるのは無しなんでしょうね。私のほうでもいい勉強になりました。
その他の回答 (3)
- ngsvx
- ベストアンサー率49% (157/315)
こんにちは。 面白いので、私も試してみました。 class A { ~main{ System.out.println("start main"); try{ B b = new B(); } catch(){ System.out.println("error in main"); } } } class B { //コンストラクタ { System.out.println("start B"); try{ C c = new C(); } catch(){ System.out.println("error in B"); } } } クラスCを削除した場合、クラスAのメインでキャッチされました。 (start Bのメッセージはでません) クラスBを削除した場合、どこでもキャッチできませんでした。 (start mainのメッセージはでません) 推測ですが、インスタンスを生成するためクラスをロードする際、 そのクラスが使用する全クラスをチェックするのではないでしょうか? ロード時のことなのでまだインスタンス化はされておらず、このような結果に なったような気がします。
- okure_donchan
- ベストアンサー率54% (25/46)
ちょっと補足いただいた内容がつかめないんですが、おそらくですけどコンパイル時存在しているクラスを実行時に削除して、そのクラスを生成する際にNoClassDefFoundErrorを発生させてそれをcatchするっていうことでしょうか? 参考までに try{ DeleteClass dc = new DeleteClass();//削除したクラス }catch(NoClassDefFoundError ncdfError){ ncdfError.printStackTrace(); }catch(Exception exception){ exception.printStackTrace(); } こんな感じでインスタンス生成するところでtry~catchすればよろしいかと。 参考までに例外処理のURLです。
- okure_donchan
- ベストアンサー率54% (25/46)
[NotClassDefFoundException]ではなく[NoClassDefFoundError]ですね。 考えられることとしてはこのクラスを生成する際にこのクラスが格納されているパッケージがimportされていないとかなんですけど。 ちょっとこのエラーが出た状態がわからないのではっきりとした答えが出せません。 できればそのソースを上げてください。 その上でtry~catch処理の部分を回答します。
補足
解答ありがとうございます。ソースをあげたいのですが結構長いソースなので全部をお見せすることは難しいです。インポートしているパッケージは java.util.* です。 最初に書き忘れてしまったのですが、今回問題になってい意図的にclassファイルを消しその上で発生するエラーを処理したいと言うものです。classファイルが最初に使用されるのは一般的にはどこなのでしょうか。 わかりにくい説明で申し訳ありませんがよろしくお願いします。
補足
ありがとうございます。 今抱えている問題は回答No.2の最初にお書きになっていることで問題無いです。 インスタンスする所をtry文で囲むのは一応挑戦したんですがどうも上手くいかないみたいです。コマンドラインから引数を与えているのですが引数の例外処理の前にこのエラーが出るようなのでインスタンスする前で例外が発生するのではと少し混乱しています。ソースの概要を短く記載するので参考にしていただけるとありがたいです。 class A{ ~main{ 引数のチェック インスタンス化(メソッドの実行) 処理~ } } class B{ メソッド1 メソッド2 } このような流れです。ファイルはA.javaの一つです。ここでB.classを意図的に削除させてから実行した時にでるエラーを捕まえたいです。なにか不明な点があればまたお返事いたします。