有 Java 编程相关的问题?

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

lucene自定义分析器中的java Nullpointerexception

为什么我在InputFile类的ts.reset()行中得到nullpointerexception?如果我使用任何内置的分析器,比如WhiteSpaceAnalyzer,我不会得到任何异常。这里有什么问题

public class CourtesyTitleFilter extends TokenFilter
{
    TokenStream input;
    Map<String,String> courtesyTitleMap = new HashMap<String,String>();
    private CharTermAttribute termAttr;
    public CourtesyTitleFilter(TokenStream input) throws IOException 
    {
        super(input);
        termAttr = input.addAttribute(CharTermAttribute.class);
        courtesyTitleMap.put("Dr", "doctor");
        courtesyTitleMap.put("Mr", "mister");
        courtesyTitleMap.put("Mrs", "miss");
    }
    @Override
    public boolean incrementToken() throws IOException 
    {
        if (!input.incrementToken())
            return false;
        String small = termAttr.toString();
        if(courtesyTitleMap.containsKey(small)) {
            termAttr.setEmpty().append(courtesyTitleMap.get(small));
            System.out.print(courtesyTitleMap.get(small));
        }
        return true;
    }
}
public class CourtesyTitleAnalyzer extends Analyzer
{
    @Override
    protected TokenStreamComponents createComponents(String fieldName, Reader reader) 
    {
        TokenStream filter = null;
        Tokenizer whitespaceTokenizer = new WhitespaceTokenizer(reader);
        try
        {
            filter = new CourtesyTitleFilter (whitespaceTokenizer);
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        return new TokenStreamComponents(whitespaceTokenizer,filter);
    }
}
public class InputFile
{
    public static void main(String[] args) throws IOException, ParseException
    {
        TokenStream ts=null;
        CourtesyTitleAnalyzer cta=new CourtesyTitleAnalyzer(); 
        try 
        {
            StringReader sb=new StringReader("Hello Mr Hari. Meet Dr Kalam and Mrs xyz");
            ts = cta.tokenStream("field",sb);
            OffsetAttribute offsetAtt = ts.addAttribute(OffsetAttribute.class);
            CharTermAttribute termAtt = ts.addAttribute(CharTermAttribute.class);
            ts.reset();
            while (ts.incrementToken()) 
            {
                String token = termAtt.toString();
                System.out.println("[" + token + "]");
                System.out.println("Token starting offset: " + offsetAtt.startOffset());
                System.out.println(" Token ending offset: " + offsetAtt.endOffset());
                System.out.println("");
            }
            ts.end();
        }
        catch (IOException e)
        {
             e.printStackTrace();
        } 
        finally 
        {
            ts.close();
            cta.close();
        }
    }
}

共 (1) 个答案

  1. # 1 楼答案

    input已在TokenFilter抽象类中定义。通过在实现中声明来隐藏它

    所以,只需删除TokenStream input;中的CourtesyTitleFilter