我没有接受过在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
}
但我有许多这些异常来捕获解析器的方法。难道我不能在更高级别上尝试捕获 - 在解析时会遇到任何异常(例如上面的那个)?但到底在哪里?
答案 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);
}