分享
 
 
 

如何处理Java里的DOM异常

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

在使用基于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类就行了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有