问题描述
我没有受过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楼
实际上根本没有调用方法,这表明您必须将ContentHandler对象传递给解析或解组操作。 将这个解析/解组调用放在try / finally块中:
try {
saxParser.parse(source, myHandler);
} finally {
db.close();
}
即使发生异常,finally块也将始终执行。
捕获NullPointerException是不良做法。 例外情况是不应该发生的。 通常,NullPointerException告诉您您在代码中犯了一个错误。
就您而言,您似乎是将XML文档中的信息存储在event
对象中。
如果该对象为null,即使您不存储信息,您是否真的希望您的程序继续执行?
通常,答案是否定的。 在这种情况下,如果您没有捕获到异常,那将是更好的选择,因此您将意识到您的代码没有执行您想要执行的任务。
如果您确实想继续执行,则处理null的正确方法不是让错误(即NullPointerException)发生,而是要确保它永远不会发生:
if (event != null) {
event.setVenueName(venueName);
}