有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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;

}

此代码在执行时始终返回空指针异常。问题是静态块没有执行。那么解决方案是什么呢


共 (2) 个答案

  1. # 1 楼答案

    Getparser应返回ParsingBehavior。 投进去

    但是您的问题来自这样一个事实,即您的解析器类没有被jvm加载,因为它没有被您的主应用程序使用。所以静态代码不会被执行

    你的工厂和公共汽车混在一起了。让主程序在工厂中注册解析器

  2. # 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);
        }
    
    }