1

リフレクションを使用してクラスを文字列名で返すFactoryクラスをCDIベースのメソッドに置き換えようとしました。

だから私は@Inject @Any Instance<IData> possibleCandidatesクラス変数としてを置きます。次に、getIDataInstanceByClassname(String className)を介してインスタンスを作成し、それをリストClass.forName内のすべてのインスタンスと比較してpossibleCandidates、一致する「注入可能な」インスタンスを返します。

ただし、アクセスpossibleCandidatesはになりNullPointerExceptionます。forループを開始するか、使用するかpossibleCandidates.iterator()。ただし、変数を検査してもnullは返されませんがInstanceImpl<T>、さまざまな値が入力されます。

どうしてそれにアクセスするとNPEが生成されるのですか?

いくつかのコード:

@Instance
@Any
private Instance<IData> possibleCandidates;

public IData getClassByClassname( String className ) {

    try {
        Class<?> clazz = Class.forName( className );
        Iterator<IData> it = possibleCandidates.iterator(); // NPE gets thrown here
        while ( it.hasNext() ) {
            IData dataInstance = it.next();
            if ( dataInstance.getClass().equals( clazz ) ) {
                return dataInstance;
            }
        }
    }
    catch( Exception e ) { ... }
}
4

1 に答える 1

2

そのリストには1つのクラスがあり、構築時にNullPointerExceptionが発生し、インスタンスリストへのアクセスが失敗しました。デバッグモードではNPEの原因を確認できませんでしたが、ログを追加すると、根本的な理由が明らかになりました。

だから、子供たちを覚えておいてください:常にキャッチブロックで例外を再スローするか、それで何かをドーム化してください。ただし、元の例外を原因として入れずに、別の例外をスローしないでください。

于 2012-08-11T13:40:33.040 に答える