在Java中进行SAX解析时捕获与XML无关的异常?
我没有受过用Java捕获异常的教育,所以这可能是一个很小的问题:在Java中进行SAX解析时捕获与XML无关的异常?,java,xml,exception-handling,try-catch,sax,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;
我解析一个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);
}
}
如果事件为null,则我的程序崩溃。我想做的是在这种情况下为有序关机(关闭db连接等)添加一些说明
我当然可以做到:
try{
event.setVenueName(venueName);
}
catch (NullPointerException e){
db.close();
//etc
}
但是我在解析器的方法中发现了许多这样的异常。我能不能把try-catch放在一个更高的级别,以便在解析时捕获任何类型的异常(比如上面的异常)?但具体在哪里 方法被调用的事实表明您必须将ContentHandler对象传递给解析或解组操作。将该parse/unmarshal调用放入try/finally块:
try {
saxParser.parse(source, myHandler);
} finally {
db.close();
}
即使发生异常,finally块也将始终执行
捕获NullPointerException是一种糟糕的做法。例外情况适用于不应发生的情况。通常,NullPointerException会告诉您在代码中犯了错误
在您的例子中,您似乎将XML文档中的信息存储在事件
对象中。如果该对象为null,那么即使不存储信息,您真的希望程序继续执行吗
通常情况下,答案是否定的。在这种情况下,如果不捕获异常,您的情况会更好,因此您会意识到您的代码没有执行您希望它执行的任务
如果确实希望继续执行,处理null的正确方法不是让错误(即NullPointerException)发生,而是确保它永远不会发生:
if (event != null) {
event.setVenueName(venueName);
}