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

Catching Exceptions not related to XML while SAX parsing in Java?

我没有受过在 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);
   }
}

如果事件为空,我的程序就会崩溃。我想做的是在这种情况下添加一些有序关闭的说明(关闭数据库连接等)。

当然可以:

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

但是我有很多这样的异常需要在解析器的方法中捕获。难道我不能在更高级别试一试 - 在解析时捕获任何类型的异常(例如上面的异常)吗?但具体在哪里?

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

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

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

捕获 NullPointerException 是一种糟糕的做法。异常是针对 不应该发生的情况。 通常,NullPointerException 告诉您代码中有错误。

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

通常,答案是否定的。在这种情况下,如果您 捕获异常,您会过得更好,这样您就会意识到您的代码没有执行您希望它执行的任务。

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

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