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)方法有机会接收空指针异常?
答案 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>