为什么这容易受到NullPointerException的影响?

时间:2017-10-06 00:15:34

标签: java exception

private static final Parser parser = getParser();

private static Parser getParser() {
        try {
             if (useParser) {
                return GenericParser.getParser();
              }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return null;
    }  

  public ParsedSentence parse(String sentence){
       if (sentence==null) {
           throw new IllegalArgumentException("sentence can't be null");
       }

         return new ParsedSentence(parser.parse(sentence));
    }

IDE报告"解析"方法可能会产生空指针异常。如果句子为空,它怎么能到达parse()方法的位置?因为抛出异常并且程序终止。对?

如果确实可以获得null,这是否意味着此方法的返回值也可以为null?

再次编辑:好的。现在我可以提供一个更完整的例子来说明图片。是的,解析器可以为null,但如果它为null,则getParser()方法中已经抛出了另一个异常。在这种情况下,为什么parser.parse(sentence)方法有机会接收空指针异常?

2 个答案:

答案 0 :(得分:0)

如果你不想在句子为null时执行一个parse(),那么你应该做的是:

if (sentence != null) {
return new ParsedSetence(parser.parse("sentence"))
}

答案 1 :(得分:-2)

String parsedSentence = parser.parse(sentence);语句仍然可以访问(至少可能,根据编译器),因为您还没有明确地将它放在else块中; Java将只处理第一个if块,然后继续执行该方法的其余部分。

你可以通过这样的格式来解决这个问题......

if(sentence==null){
   throw new IllegalArgumentException("sentence can't be null");
} else {
    String parsedSentence = parser.parse(sentence);
}

...但你应该做的是使用try块:

public ParsedSentence parse(String sentence) throws NullPointerException {
    try {
        String parsedSentence = parser.parse(sentence);
        return new ParsedSentence(parsedSentence);
    }
    return null;
}

因为这意味着这个方法也可以返回一个null(或抛出一个异常),你必须确保以类似的方式处理它,无论你从哪个方法调用这个方法< / p>