2011-08-29 55 views
0

好,我搜索互聯網來這個問題,但沒有發現任何適當的溶液工廠方法與類註冊圖案產生空指針異常

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; 

} 

此代碼在執行時總是返回空指針異常。斑紋是靜態塊不執行。那麼解決方案是什麼?

+0

請發佈stacktrace,否則我們不得不猜測您的NPE來自哪裏。 – Preston

回答

1

Getparser應該返回一個ParsingBehavior。它在裏面投了。

但是你的問題來自於你的解析器類沒有被jvm加載,因爲它沒有被你的main使用。所以靜態代碼不會被執行。

你正在混合你的工廠與公共汽車。讓主註冊您的解析器在工廠。

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

}