简体   繁体   中英

Nullpointerexception in lucene custom analyser

Why I am getting nullpointerexception in ts.reset() line in InputFile class? If I use any inbuilt analyser like whitespaceanalyser, I don't get any exception. What is the problem here?

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

input is already defined in the TokenFilter abstract class. You are hiding it by declaring it in your implementation.

So, just delete the line TokenStream input; in your CourtesyTitleFilter .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM