具有类注册的工厂方法模式会生成nullpointer异常

时间:2011-08-29 02:14:31

标签: java xml design-patterns

好吧,我在互联网上搜索了这个问题,但没有找到任何合适的解决方案

http://www.oodesign.com/factory-pattern.html

中的

作者描述了使用反射或对象创建来注册类

我通过以下代码尝试了对象创建方法: 工厂类

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);

    }

}

每个解析器在工厂中注册: public class NormalParser extends 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异常。问题是静态块没有执行。那么解决方案是什么?

2 个答案:

答案 0 :(得分:2)

正如“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);
    }

}

答案 1 :(得分:1)

Getparser应该返回一个ParsingBehavior。 投入其中。

但是你的问题来自你的解析器类没有被jvm加载的事实,因为你的main没有使用它。所以不执行静态代码。

您正在将工厂与公共汽车混合。让主要在工厂注册你的解析器。