クラス登録を伴うファクトリメソッドパターンがnullpointer例外を生成する

design-patterns java xml
クラス登録を伴うファクトリメソッドパターンがnullpointer例外を生成する

まあ、私はこの問題をインターネットで検索しましたが、適切な解決策が見つかりませんでした

著者は、リフレクションまたはオブジェクト作成を使用してクラスを登録するように説明しました

私は次のコードでオブジェクト作成アプローチを試しました:ファクトリークラス

package com.mf.egyptse;

import java.util.HashMap;

public abstract class ParserFactory {

    private static HashMap parsers;

    static
    {
        parsers= new HashMap();

        System.out.println("This is first static block");
    }


    static void putParser(Object key,Object parser)
    {
        parsers.put(key, parser);

    }
    static Object getParser(Object key)
    {
        return parsers.get(key);

    }

}

各パーサーはそれ自体をファクトリーに登録します。パブリッククラスNormalParserはParserFactoryを拡張し、ParsingBehavior \ {

/**
 * Define the number of nested columns or tags to be parsed
 */
final static int NO_OF_COLOUMNS = 13;
static String input = null;
static String[] elements= {"name","sector", "p.c", "open", "close", "chgpercent", "lastprice", "high", "low","value","volume","trades","marketcap"};



static
{
    ParserFactory.putParser("normal", new NormalParser());

}

そして主なものは:

public class Main {

    /**
     * @param args
     * @throws IOException
     * @throws InterruptedException
     */
    public static void main(String[] args) throws IOException, InterruptedException {

//      NileParser.parseNile();
//      OTCParser.parseOTC();
//      NormalParser.parseNormal();


        ParsingBehavior parser = (ParsingBehavior) ParserFactory.getParser("normal");



        parser.parseToXML(null, null);

    }

}

インターフェイスは次のとおりです。

package com.mf.egyptse;

import java.io.File;
import java.io.IOException;

public interface ParsingBehavior {

    void parseToXML(CharSequence input,File file) throws IOException;

}

このコードは、実行中に常にnullpointer例外を返します。 問題は、静的ブロックが実行されないことです。 解決策は何ですか?

  0  0


ベストアンサー

「Snicolas」で回答されているように、あなたの問題は、HashMapが使用されている時間までに読み込まれないことです。 mainの静的ブロックは、これらのクラスが最初に自身を登録するように、必要なすべてのパーサークラスをロードする必要があります。

public class Main {

    static {
        // Load necessary parser classes
        Class.forName("normal");
    }

    /**
     * @param args
     * @throws IOException
     * @throws InterruptedException
     */
    public static void main(String[] args) throws IOException, InterruptedException {
        ParsingBehavior parser = (ParsingBehavior) ParserFactory.getParser("normal");
        parser.parseToXML(null, null);
    }

}

2


GetparserはParsingBehaviorを返す必要があります。 その中にキャストします。

しかし、問題は、メインで使用されていないため、パーサークラスがjvmでロードされていないという事実に起因しています。 したがって、静的コードは実行されません。

あなたの工場をバスと混ぜています。 メインにパーサーをファクトリーに登録させます。

1


タイトルとURLをコピーしました