服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

如何处理java里的dom异常


  在使用基于java的xml剖析器时,你常常要应付异常(exception)的处理。有些异常很容易处理,而其他的要更困难一些。在本文里,我们会看一些在使用xml文档时常见的异常,并探讨一下如何处理好这些异常。

dom异常

在使用dom剖析器进行剖析操作的时候,xml文档会被立即处理并保存在内存里。内存里的对象会被做一个文档对象模型(document object model)来参照??这基本上就是一种用于访问底层xml文档的面向对象的方法。在dom里处理xml文档的时候,很多东西都会出错。

大多数dom下的异常都是作为domexception类的一个实例发生的。这个类支持15种不同的、具体的异常条件。每种条件都被指定为domexception类的一个成员,叫做code。除了这个code成员,domexception类还包含一组15个静态成员,它们被用来确定异常的条件。

这15个条件是:

domstring_size_err
hierarchy_request_err
index_size_err
inuse_attribute_err
invalid_access_err
invalid_character_err
invalid_modification_err
invalid_state_err
namespace_err
no_data_allowed_err
no_modification_allowed_err
not_found_err
not_supported_err
syntax_err
wrong_document_err
当domexception出现的时候,如果不检查异常对象里的code,那么你就不会知道到底是这些条件中的哪一个导致了这个异常。为了正确地处理这个异常,你将需要确定是哪个条件导致了这个异常。
listing a显示了一个java程序,它创建新的dom文档失败了:

listing a: domfail.java
import org.apache.xerces.dom.*;
import org.w3c.dom.*;

public class domfail {

public static void main(string[] args) {
document doc = new documentimpl();
element rootelement;

try{
rootelement = doc.createelement("order");
rootelement.setattribute("〈id", "109823");
doc.appendchild( rootelement );
} catch (domexception e) {
switch(e.code) {
case domexception.domstring_size_err:
break;
case domexception.hierarchy_request_err:
break;
case domexception.index_size_err:
break;
case domexception.inuse_attribute_err:
break;
case domexception.invalid_access_err:
break;
case domexception.invalid_character_err:
system.out.println("there is an invalid character");
break;
case domexception.invalid_modification_err:
break;
case domexception.invalid_state_err:
break;
case domexception.namespace_err:
break;
case domexception.no_data_allowed_err:
break;
case domexception.no_modification_allowed_err:
break;
case domexception.not_found_err:
break;
case domexception.not_supported_err:
break;
case domexception.syntax_err:
break;
case domexception.wrong_document_err:
break;
default:
system.out.println("unknown dom exception");
break;
}
}
}
}

要注意,我们使用了一种切换机制来确定到底满足了哪个条件。这样我们就可以很容易地测试每个条件,直到我们找到正确的那个。

在这个例子里,我们已经在用于无效字符的条件里放置了一条消息。当你编译并运行这个例子的时候,你会看到这样一条信息:存在非法字符(there is an invalid character)。你会希望正确地处理每个条件,而不是将条件留作空白。
你可能想要提取出条件异常的处理(方法),并将它放置到它自己的方法里,甚至是它自己的类里。那样的话,你就可以在你的代码里放入更加简单的异常处理机制。例如,我们可以创建一个叫做domexceptionhandler的新类,如listing b所示:

listing b: domexceptionhandler.java
import org.w3c.dom.*;

public class domexceptionhandler {
public static void handledomexception(domexception e) {
if (e != null) {
switch(e.code) {
case domexception.domstring_size_err:
break;
case domexception.hierarchy_request_err:
break;
case domexception.index_size_err:
break;
case domexception.inuse_attribute_err:
break;
case domexception.invalid_access_err:
break;
case domexception.invalid_character_err:
system.out.println("there is an invalid character");
break;
case domexception.invalid_modification_err:
break;
case domexception.invalid_state_err:
break;
case domexception.namespace_err:
break;
case domexception.no_data_allowed_err:
break;
case domexception.no_modification_allowed_err:
break;
case domexception.not_found_err:
break;
case domexception.not_supported_err:
break;
case domexception.syntax_err:
break;
case domexception.wrong_document_err:
break;
default:
system.out.println("unknown dom exception");
break;
}
}
}
}
既然我们有了用来处理dom异常的专用处理器类,那么我们就可以从我们的处理代码里调用它。listing c里的代码是对domfail类的一个修正,它使用了我们新的domexceptionhandler类:

listing c: domfail2.java
import org.apache.xerces.dom.*;
import org.w3c.dom.*;

public class domfail2 {

public static void main(string[] args) {
document doc = new documentimpl();
element rootelement;

try{
rootelement = doc.createelement("order");
rootelement.setattribute("〈id", "109823");
doc.appendchild( rootelement );
} catch (domexception e) {
domexceptionhandler.handledomexception(e);
}
}
}

这个新的类要比我们原来的domfail类简单得多。它还让我们能够更容易地重新使用异常处理器的代码。我们现在不用每次需要的时候才剪切和粘贴事件处理器代码,而只是调用domexceptionhandler类就行了。

扫描关注微信公众号