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