шаблон фабричного метода с регистрацией класса создает исключение нулевого указателя - PullRequest
0 голосов
/ 29 августа 2011

хорошо, я искал в интернете эту проблему, но не нашел правильного решения

в 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 ]

2 голосов
/ 05 сентября 2012

Как ответил «Сниколас», ваша проблема в том, что 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 голос
/ 29 августа 2011

Getparser должен возвращать ParsingBehavior. В ролях внутри.

Но ваша проблема связана с тем, что ваш класс парсера не загружается jvm, поскольку он не используется вашим main. Таким образом, статический код не выполняется.

Вы смешиваете свою фабрику с автобусом. Позвольте основному зарегистрировать ваш парсер на фабрике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...