作者描述了使用反射或对象创建来注册类
我通过以下代码尝试了对象创建方法: 工厂类
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异常。问题是静态块没有执行。那么解决方案是什么?
答案 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没有使用它。所以不执行静态代码。
您正在将工厂与公共汽车混合。让主要在工厂注册你的解析器。