当前位置: 代码迷 >> java >> 捕获Java中进行SAX解析时与XML不相关的异常?
  详细解决方案

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

热度:82   发布时间:2023-07-25 19:04:08.0

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

但是我有很多例外都可以解析器的方法。 我不能只是尝试-在解析时捕获任何种类的异常(例如上面的异常)的更高级别的捕获? 但是到底在哪里?

实际上根本没有调用方法,这表明您必须将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);
}
  相关解决方案