【问题标题】:Catching Exceptions not related to XML while SAX parsing in Java?在 Java 中进行 SAX 解析时捕获与 XML 无关的异常?
【发布时间】:2015-07-30 21:11:51
【问题描述】:

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

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

【问题讨论】:

    标签: java xml exception-handling try-catch sax


    【解决方案1】:

    您的 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多