带有类注册的工厂方法模式会产生空指针异常



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

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

每个解析器在工厂中注册自己:公共类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异常。问题是静态块不执行。那么解决方案是什么呢?

正如" nicolas"所回答的那样,您的问题是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);
    }
}

Getparser应该返回一个ParsingBehavior。

但是你的问题来自于这样一个事实:你的解析器类不是由jvm加载的,因为它不是由你的main使用的。因此不执行静态代码。

你把工厂和公共汽车混在一起了。让main在工厂中注册解析器。

最新更新