在Java中进行SAX解析时捕获与XML无关的异常?

时间:2015-07-30 21:11:52

标签: java xml exception-handling try-catch sax

我没有接受过在Java中捕获异常的教育,因此这可能是一个微不足道的问题:
我解析一个XML文件,在endElement的方法中我有:

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {

   if (qName.equals("manufacturer")) {
            newManufacturer = false;
            String venueName = manufacturerBuilder.toString();
            event.setVenueName(venueName);
   }
}

如果event为null,我的程序崩溃了。我想要做的是在这种情况下添加一些有序关闭的指令(关闭数据库连接等)。

我当然能做到:

try{
   event.setVenueName(venueName);
}
catch (NullPointerException e){
   db.close();
//etc
}

但我有许多这些异常来捕获解析器的方法。难道我不能在更高级别上尝试捕获 - 在解析时会遇到任何异常(例如上面的那个)?但到底在哪里?

1 个答案:

答案 0 :(得分:1)

您的ContentHandler.endElement方法被调用的事实表明您必须将ContentHandler对象传递给解析或解组操作。将该解析/解组调用放在try / finally块中:

try {
    saxParser.parse(source, myHandler);
} finally {
    db.close();
}

即使发生异常,finally块也将始终执行。

捕获NullPointerException是不好的做法。例外情况适用于不应发生的情况。通常,NullPointerException会告诉您在代码中犯了错误。

在您的情况下,您似乎将XML文档中的信息存储在event对象中。如果该对象为null,您是否真的希望程序继续执行,即使您不想存储信息?

通常,答案是否定的。在这种情况下,如果您没有捕获异常,那么您会感觉更好,因此您将意识到您的代码没有执行您希望它执行的任务。

如果你真的想继续执行,处理空值的正确方法不是让错误(即NullPointerException)发生,而是确保它永远不会发生:

if (event != null) {
    event.setVenueName(venueName);
}