Java では、Class.forName は null を返すことができますか?それとも、クラスが見つからない場合は常に ClassNotFoundException または NoClassDefFoundError をスローしますか?
4 に答える
Java Docs は、クラスが見つからない場合は ClassNotFoundException をスローすると言っているので、null を返すことはないと思います。
null はこのメソッドのドキュメントのどこにも言及されておらず、メソッドが例外をスローする代わりに null を返すことが理にかなっている状況はないように思われるため、それを想定するのはかなり安全だと思いますnull を返すことはありません。
NoClassDefFoundError はスローされませんが、ClassNotFoundException がスローされる場合があります。
デフォルトのクラス ローダーを使用すると、null を受け取ることはありません。ただし、jdigital が言うように、使用しているセキュリティ モデルまたは他のタイプのプロキシ ローダーに応じて、任意の数のカスタム クラスローダーの影響を受ける可能性があります (意図的またはその他の方法で)。
一体、 forName でさえ ClassLoader をパラメータとして取ることができます... :)
ピコ
@Dan Dyer は間違っています。Class.forName は、試行中のクラスがその静的イニシャライザで ClassNotFoundException エラーを取得した場合にをスローできます。NoClassDefFoundError
以下はウンテ
class Outer {
public static final void main(final String[] args) throws Exception{
Class.forName("Inner");
}
}
これをコンパイルして、他のファイルのないディレクトリで実行すると、次のようになりますClassNotFoundException: Inner
次に、同じディレクトリに次を追加し、すべてをコンパイルして、正常java Outer
に実行されることを確認します。
class Inner {
static Inner2 _i2 = new Inner2();
}
class Inner2 {}
最後に、Inner2.class を削除して Outer を再実行すると、次のようになりますNoClassDefFoundError: Inner2
。caused by ClassNotFoundException: Inner2