Java-Web系统常用的第三方接口_第1页
Java-Web系统常用的第三方接口_第2页
Java-Web系统常用的第三方接口_第3页
Java-Web系统常用的第三方接口_第4页
Java-Web系统常用的第三方接口_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java Web系统常用的第三方接口编写人:阿蜜果日期:2010-12-21版权所有,转载请注明出处: HYPERLINK /amigoxie/archive/2010/12/21/341257.html /amigoxie/archive/2010/12/21/341257.html1. Web Service接口1.1 接口方式说明和优点在笔者的开发生涯中,当作为接口提供商给第三方提供接口时,以及作为客户端去调用第三方提供的接口时,大部分时候都是使用Web Service接口,Web Service作为接口使用广泛的原因,与它的特点息息相关。Web Service的主要目标是跨平台的可互操

2、作性,为了实现这一目标,Web Service 完全基于XML(可扩展标记语言)、XSD(XML Schema)等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。因此使用Web Service有许多优点:1.1.1 跨防火墙的通信如果应用程序有成千上万的用户,而且分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题。因为客户端和服务器之间通常会有防火墙或者代理服务器。要调用Web Service,可以直接使用SOAP客户端,然后把它和应用程序连接起来。不仅缩短了开发周期,还减少了代码复杂度,并能够增强应用程序的可维护性。1.1.2 跨程序语言的应用程序集

3、成在企业的各种应用系统中,很多系统不是使用相同的语言编写的,例如有的使用Java,有的使用php、C#、asp。当各种系统之间需要交互时,可使用各种语言都通用的WSDL定义接口,对外将需要的接口暴露给指定的客户。XML Web services 提供了在松耦合环境中使用标准协议(HTTP、XML、SOAP 和 WSDL)交换消息的能力。消息可以是结构化的、带类型的,也可以是松散定义的。 1.1.3 软件和数据重用Web Service在允许重用代码的同时,可以重用代码背后的数据。使用Web Service,再也不必像以前那样,要先从第三方购买、安装软件组件,再从应用程序中调用这些组件;只需要直

4、接调用远端的Web Service就可以了。另一种软件重用的情况是,把好几个应用程序的功能集成起来,通过Web Service “暴露”出来,就可以非常容易地把所有这些功能都集成到你的门户站点中,为用户提供一个统一的、友好的界面。可以在应用程序中使用第三方的Web Service 提供的功能,也可以把自己的应用程序功能通过Web Service 提供给别人。两种情况下,都可以重用代码和代码背后的数据。 1.2 重要概念1.2.1 何为Web Service? Web Service是构建互联网分布式系统的基本部件,它是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,别

5、人能够用编程的方法通过Web来调用这个应用程序。它通过标准通信协议,在互联网上以服务的方式发布有用的程序模块,目前大部分是用SOAP作为通信协议。它提供一份详细的接口说明书,来帮助用户构建应用程序,这个接口说明书叫WSDL(Web服务描述语言,Web Service Description Language)。通常已发布的Web Service要注册到管理服务器,便于使用者查询和使用。这个是通过UDDI(统一描述、发现和集成,Universal Discovery Description and Integration)来完成的。 1.2.2 何为SOAP协议?SOAP定义SOAP消息的XML

6、格式(XML格式),如果你用一对SOAP标记(SOAP Elements)把XML文档括起来,那么这个就是一个SOAP消息。SOAP规范还定义了怎样用XML来描述程序数据,怎样执行RPC(远程过程调用,Remote Procedure Call)。大多数SOAP解决方案都支持RPC-style应用程序,因为很多程序员已对DCOM或CORBA熟悉。它还支持Document-style应用程序(SOAP消息只包含XML文本信息)。Document-style应用程序有很好的灵活性,所以很多用RPC很难构建的Web Service用这种方式构建。最后SOAP规范还定义了HTTP消息是怎样传输SOAP

7、消息的。这并不代表SOAP只能用HTTP来作为传输协议,MSMQ、SMTP、TCP/IP都可以做SOAP的传输协议。安全性对于应用程序来说是很重要的。那么SOAP的安全性如何呢?对于把HTTP作为传输协议的SOAP来说是没有问题的,因为HTTP协议已经有很好的安全构架。那么用其他传输协议会出现安全问题吗?这方面也已经有相关规范( HYPERLINK /A/2002-03-01/%22http:/library/default.asp?url=/library/en-us/dnglobspec/html/ws-security.asp%22 /library/default.asp?url=/l

8、ibrary/en-us/dnglobspec/html/ws-security.asp)。1.2.3 何为WSDL?WSDL是一种XML文档,它定义SOAP消息和这些消息是怎样交换的。IDL(Interface Description Language,接口描述语言)是用于COM和CORBA的,WSDL是用于SOAP的。WSDL是一种XML文档,所以可以阅读和编辑,但很多时候是用工具来创建、由程序阅读。举个实例,当读者需要使用第三方的Web Service构建应用程序。你可以向接口提供商索取使用WSDL文档,在该文档中详细的说明了各个方法的方法名、参数和参数类型等信息。在Java等编程语言的

9、IDE(例如My Eclipse)中,可以根据Web Servie生成对应的测试代码,稍微修改一下即可。1.2.4 何为UDDI?UDDI可以比喻成电话本,电话本里记录的是电话信息,而UDDI记录的是Web Service信息。可以不把Web Service注册到UDDI。但如果要让全球的人知道这个Web Service,最好还是注册到UDDI。UDDI目录说明文件也是一个XML文档,它包括三个部分。“白页(White Paper)”说明提供Web Service的公司(人)信息,比如说名称、地址和联系方式等等。“黄页(Yellow Paper)”说明UDDI目录的分类,比如说金融、服务和印刷

10、等等。“绿页(green Paper)”说明接口(Web Service 提供的)的详细信息。UDDI提供多种查询方式,来帮助你找到需要的Web Service。如果你查询与财务有关的Web Service,那么UDDI会提供详细的信息。1.2.5 何为XML?XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。在Web Service接口中,WSDL和UDDI目录文件都是一种XML文档,XML解决了数据表示的问题。1.2.6 何为XSD?X

11、ML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整型数到底代表什么?16位,32位,还是64位?W3C制定的XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。Web Service就是用XSD来作为其数据类型系统的。1.3 开发Web Service接口和调用测试在Java IDE环境中开发Web Service接口,以及如何调用第三方的WSDL文档如何进行接口测试的参考文章详见:1) HYPERLINK /amigoxie/archive/2007/09/26/1482

12、07.html 使用XFire+Spring构建Web Service(一)helloWorld篇: HYPERLINK /amigoxie/archive/2007/09/26/148207.html /amigoxie/archive/2007/09/26/148207.html2) HYPERLINK /amigoxie/archive/2007/09/28/149074.html 使用XFire+Spring构建Web Service(二): HYPERLINK /amigoxie/archive/2007/09/28/149074.html /amigoxie/archive/200

13、7/09/28/149074.html3) HYPERLINK /amigoxie/archive/2009/11/20/303038.html 根据wsdl生成对应的Java代码进行接口测试(一): HYPERLINK /amigoxie/archive/2009/11/20/303038.html /amigoxie/archive/2009/11/20/303038.html1.4 开发举例1.4.1作为提供商提供hello world的接口参见: HYPERLINK /amigoxie/archive/2007/09/26/148207.html 使用XFire+Spring构建Web

14、 Service(一)helloWorld篇: HYPERLINK /amigoxie/archive/2007/09/26/148207.html /amigoxie/archive/2007/09/26/148207.html 1.4.2作为提供商提供用户信息查询接口参见: HYPERLINK /amigoxie/archive/2007/09/28/149074.html 使用XFire+Spring构建Web Service(二): HYPERLINK /amigoxie/archive/2007/09/28/149074.html /amigoxie/archive/2007/09/

15、28/149074.html2. js接口2.1 接口方式说明和优缺点在开发的过程中,也遇到过需要调用第三方接口的情况,例如笔者在完成的一个股票查询的小demo中,就需要调用新浪提供的股票查询的js接口。另外有一次,在系统中使用了第三方的GIS系统,调用的也是js接口。因为调用js接口的门槛很低,所以有的接口供应商会提供多种调用接口的方式,例如Web Servivce接口和js接口等。对于浏览器来说,script标签的src属性所指向资源就跟img标签的src属性所指向的资源一样,都是一个静态资源,浏览器会在适当的时候自动去加 载这些资源,而不会出现所谓的跨域问题。这样我们就可以通过该属性将要

16、访问的数据对象引用进当前页面而绕过js跨域问题。当然,前提是接口必须是返回一段js脚本,如一个json对象数组定义的脚本:modlist=modname:mod1,usernum:200,url:/widget/info/1,modname:mod2,usernum:300,url:/widget/info/2,;但script标签也有一定的局限性,并不能解决所有js跨域问题。script标签的src属性值不能动态改变以满足在不同条件下获取不同数据的需求, 更重要的是,不能通过这种方式正确访问以xml内容方式组织的数据。2.2 开发举例2.2.1新浪股票查询的js接口功能说明:stockDet

17、ail.jsp根据传入的stockId参数,调用新浪股票查询提供的js接口返回股票结果信息,并解析返回结果,将股票信息在页面展示出来。stockDetail.jsp代码参考如下:股票查询结果linkhref=/css/style.csstype=text/cssrel=stylesheetscripttype=text/javascriptsrc=/list=s_shcharset=gb2312tdcolspan=2valign=bottomalign=leftstyle=width:176px;background:url(/images/line2_bg.gif)repeat-x;bord

18、er-bottom:1pxsolid#b0bec7;height=19股票查询结果指数名称:当前点数:当前价格:涨跌率:成交额(w):tdcolspan=2valign=bottomalign=rightstyle=width:176px;background:url(/images/line2_bg.gif)repeat-x;border-bottom:1pxsolid#b0bec7;height=191日K线0返回!-/查询结果的格式为:指数名称,当前点数,当前价格,涨跌率,成交量(手),成交额(万元)/解析字符串varstockValue=hq_str_s_sh;varstockArra

19、y=stockValue.split(,);document.getElementById(stockName).innerText=stockArray0;document.getElementById(currentPoint).innerText=stockArray1;document.getElementById(currentPrice).innerText=stockArray2;document.getElementById(ratio).innerText=stockArray3;document.getElementById(turnVolume).innerText=st

20、ockArray5;-带上6位stockId参数(例如:值为000002),实时的A股(代号为s_sh000002)查询结果如下图所示: 在文件头部可看到如下一句引入了新浪提供的js:scripttype=text/javascriptsrc=/list=s_shcharset=gb2312用如下语句获得通过接口查询到的数据:varstockValue=hq_str_s_sh;2.2.2对外提供js接口 对外提供js接口只需要通过请求的地址返回的是JSON字符串即可。在本实例中,用到了笔者一篇JSON文章的实例(JSON知识总结入门篇: HYPERLINK /amigoxie/archive/

21、2010/09/25/332832.html /amigoxie/archive/2010/09/25/332832.html),在上面进行了小幅修改,简便起见,没有创建任何的Java类,提供的对外的js接口是直接通过json.txt,通过该文件返回一个JSON字符串,在实际的应用情况中,可以是一个Ation等。json.txt定义了JSON格式的字符串,并定义放在json这个变量中,jsInterface.html文件请求远端的一个路径,而后解析返回的JSON串,并打印出来。json.txt在远端的一个服务器上,例如该文件访问地址为: HYPERLINK /json.txt /json.tx

22、t,文件的内容如下:varjson=programmers:firstName:阿蜜果,lastName:McLaughlin,email:brettnewI,firstName:范范,lastName:Hunter,email:jason,firstName:高子,lastName:Harold,email:elharo,authors:firstName:安安,lastName:Asimov,genre:sciencefiction,firstName:Tad,lastName:Williams,genre:fantasy,firstName:Frank,lastName:Peretti,

23、genre:christianfiction,musicians:firstName:茂茂,lastName:Clapton,instrument:guitar,firstName:Sergei,lastName:Rachmaninoff,instrument:piano在本地创建一个jsInterface.html网页,使用请求返回json字符串的路径信息,接着进行打印,该文件代码如下:JSInterfaceTestalert(grammers0.firstName+,+grammers0.lastName+,+grammers0.email);alert(grammers1.firstNa

24、me+,+grammers1.lastName+,+grammers1.email);alert(grammers2.firstName+,+grammers2.lastName+,+grammers2.email);alert(json.authors0.firstName+,+json.authors0.lastName+,+json.authors0.genre);alert(json.authors1.firstName+,+json.authors1.lastName+,+json.authors1.genre);alert(json.authors2.firstName+,+jso

25、n.authors2.lastName+,+json.authors2.genre);alert(json.musicians0.firstName+,+json.musicians0.lastName+,+json.musicians0.instrument);alert(json.musicians1.firstName+,+json.musicians1.lastName+,+json.musicians1.instrument); 运行后可看到运行结果与JSON知识总结入门篇第一个实例的运行结果一致。 3. http接口3.1 接口方式说明和优缺点需要为第三方提供一个接口,本来打算继续

26、使用Web Service接口,结果那边的开发人员说,他们没有使用过Web Service接口(是做IPTV的一个公司),希望我们能够提供http方式的接口。另外我们一般在提供Web Sservice接口的同时,也对外提供http接口。3.2 开发实例3.2.1 向http接口发送消息的使用小程序本实例对自己提供请求信息为xml格式的http接口,将xml格式的请求信息发给http接口的地址后,将调用接口的返回消息简单的显示在页面,为了简便起见,笔者没有对js代码进行包装。该html文件代码如下:httpinterfacetest/XMLHttpRequestvarhttp_request=f

27、alse;functionsend_request(method,url,content,responseType,callback)http_request=false;/XMLHttpRequestif(window.XMLHttpRequest)/Mozillahttp_request=newXMLHttpRequest();if(http_request.overrideMimeType)/MIMEhttp_request.overrideMimeType(text/xml);elseif(window.ActiveXObject)/IEtryhttp_request=newActiv

28、eXObject(Msxml2.XMLHTTP);catch(e)tryhttp_request=newActiveXObject(Microsoft.XMLHTTP);catch(e)if(!http_request)window.alert(XMLHttpRequestcreateError.);returnfalse;if(responseType.toLowerCase()=text|responseType.toLowerCase()=xml)http_request.onreadystatechange=callback;elsewindow.alert(errorresponse

29、Type.);returnfalse;if(method.toLowerCase()=get)http_request.open(method,url,true);elseif(method.toLowerCase()=post)http_request.open(method,url,true);http_request.setRequestHeader(Content-Type,text/xml);elsewindow.alert(httpmethoderror.);returnfalse;http_request.send(content);functionsubmitInfo()var

30、form=document.httpTestForm;varpathInfo=form.pathInfo.value;varxmlInfo=form.xmlInfo.value;form.returnInfo.value=wait;send_request(POST,pathInfo,xmlInfo,xml,showHttpTestBack);functionshowHttpTestBack()if(http_request.readyState=4)if(http_request.status=200)varresponseInfo=http_request.responseText;var

31、form=document.httpTestForm;form.returnInfo.value=responseInfo;httpinterfaceTestxmlInfo:pathInfo:returnInfo:访问该页,页面很简单,输入正确的xml请求消息,和正确的路径信息,点击“Submit”按钮,通过ajax调用http端口,并在成功取得信息后将返回结果显示在最后一个文本框:3.2.2 作为提供商提供http接口在这个实例中,服务器提供了一个http接口,在这里是一个jsp页面的访问地址,实际应用过程中,可以是Servlet或Action的访问地址,在这个实例中,客户端发送http g

32、et发送请求,带上了hotel(宾馆信息)和name(顾客姓名),http接口程序拿到参数信息后,根据一定算法检查分配空闲房间号,这里为了简便起见,只是随机的生成一个数字返回给客户端。http接口的简单程序httpInterface.jsp如下所示:httpInterface可在IE上带上参数访问这个地址,可看到参考的结果信息,例如访问 HYPERLINK http:/IP:端口/ http:/IP:端口/应用名称/httpInterface.jsp?hotel=motel&name=amigo,参考返回结果如下:hotel=motel;name=amigo;room=4074. 参考文章1)

33、Web Service入门: HYPERLINK /j/2007-09-09/200709092111735.shtml /j/2007-09-09/200709092111735.shtml2)Web Service简介特点,优点,缺点: HYPERLINK /linjk03/blog/item/4ee93b03a5d29a8dd43f7cd5.html /linjk03/blog/item/4ee93b03a5d29a8dd43f7cd5.html3)Web Service百度百科: HYPERLINK /view/67105.htm /view/67105.htm4)如何解决js跨域问题

34、: HYPERLINK /blog/index.php/archives/542 /blog/index.php/archives/542posted on 2010-12-21 17:24 HYPERLINK /amigoxie/ 阿蜜果 阅读(3680) HYPERLINK /amigoxie/archive/2010/12/21/341257.html l Post 评论(3) HYPERLINK /amigoxie/admin/EditPosts.aspx?postid=341257 编辑 HYPERLINK /amigoxie/AddToFavorite.aspx?id=341257

35、 收藏 所属分类: HYPERLINK /amigoxie/category/19973.html Java 、 HYPERLINK /amigoxie/category/47773.html 解决方案附录资料:如何处理Java异常及常见异常六种异常处理的陋习你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWriter out = . 2 java.sql.Connection conn = . 3 try / 4 Statement stat = conn.createSta

36、tement(); 5 ResultSet rs = stat.executeQuery( 6 select uid, name from user); 7 while (rs.next() 8 9 out.println(ID: + rs.getString(uid) / 10 ,姓名: + rs.getString(name); 11 12 conn.close(); / 13 out.close(); 14 15 catch(Exception ex) / 16 17 ex.printStackTrace(); /, 18 作为一个Java程序员,你至少应该能够找出两个问题。但是,如果你

37、不能找出全部六个问题,请继续阅读本文。 本文讨论的不是Java异常处理的一般性原则,因为这些原则已经被大多数人熟知。我们要做的是分析各种可称为“反例”(anti-pattern)的违背优秀编码规范的常见坏习惯,帮助读者熟悉这些典型的反面例子,从而能够在实际工作中敏锐地察觉和避免这些问题。 反例之一:丢弃异常 代码:15行-18行。 这段代码捕获了异常却不作任何处理,可以算得上Java编程中的杀手。从问题出现的频繁程度和祸害程度来看,它也许可以和C/C+程序的一个恶名远播的问题相提并论?不检查缓冲区是否已满。如果你看到了这种丢弃(而不是抛出)异常的情况,可以百分之九十九地肯定代码存在问题(在极少

38、数情况下,这段代码有存在的理由,但最好加上完整的注释,以免引起别人误解)。 这段代码的错误在于,异常(几乎)总是意味着某些事情不对劲了,或者说至少发生了某些不寻常的事情,我们不应该对程序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace算不上“处理异常”。不错,调用printStackTrace对调试程序有帮助,但程序调试阶段结束之后, printStackTrace就不应再在异常处理模块中担负主要责任了。 丢弃异常的情形非常普遍。打开JDK的ThreadDeath类的文档,可以看到下面这段说明:“特别地,虽然出现ThreadDeath是一种正常的情形,但ThreadDe

39、ath类是Error而不是Exception的子类,因为许多应用会捕获所有的Exception然后丢弃它不再理睬。”这段话的意思是,虽然ThreadDeath代表的是一种普通的问题,但鉴于许多应用会试图捕获所有异常然后不予以适当的处理,所以JDK把 ThreadDeath定义成了Error的子类,因为Error类代表的是一般的应用不应该去捕获的严重问题。可见,丢弃异常这一坏习惯是如此常见,它甚至已经影响到了Java本身的设计。 那么,应该怎样改正呢?主要有四个选择: 1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个人或进行其他一些处理,要根据具体的情形确定应该采取的动作。再次说明,

40、调用printStackTrace算不上已经“处理好了异常”。 2、重新抛出异常。处理异常的代码在分析异常之后,认为自己不能处理它,重新抛出异常也不失为一种选择。 3、把该异常转换成另一种异常。大多数情况下,这是指把一个低级的异常转换成应用级的异常(其含义更容易被用户了解的异常)。 4、不要捕获异常。 结论一:既然捕获了异常,就要对它进行适当的处理。不要捕获异常之后又把它丢弃,不予理睬。 反例之二:不指定具体的异常 代码:15行。 许多时候人们会被这样一种“美妙的”想法吸引:用一个catch语句捕获所有的异常。最常见的情形就是使用catch(Exception ex)语句。但实际上,在绝大多数

41、情况下,这种做法不值得提倡。为什么呢? 要理解其原因,我们必须回顾一下catch语句的用途。catch语句表示我们预期会出现某种异常,而且希望能够处理该异常。异常类的作用就是告诉 Java编译器我们想要处理的是哪一种异常。由于绝大多数异常都直接或间接从java.lang.Exception派生,catch (Exception ex)就相当于说我们想要处理几乎所有的异常。 再来看看前面的代码例子。我们真正想要捕获的异常是什么呢?最明显的一个是SQLException,这是JDBC操作中常见的异常。另一个可能的异常是IOException,因为它要操作OutputStreamWriter。显然,

42、在同一个catch块中处理这两种截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOException就要好多了。这就是说,catch语句应当尽量指定具体的异常类型,而不应该指定涵盖范围太广的Exception类。 另一方面,除了这两个特定的异常,还有其他许多异常也可能出现。例如,如果由于某种原因,executeQuery返回了null,该怎么办?答案是让它们继续抛出,即不必捕获也不必处理。实际上,我们不能也不应该去捕获可能出现的所有异常,程序的其他地方还有捕获异常的机会?直至最后由JVM处理。 结论二:在catch语句中尽可能指定具体的异常类型,必要时使用多

43、个catch。不要试图处理所有可能出现的异常。 反例之三:占用资源不释放 代码:3行-14行。 异常改变了程序正常的执行流程。这个道理虽然简单,却常常被人们忽视。如果程序用到了文件、Socket、JDBC连接之类的资源,即使遇到了异常,也要正确释放占用的资源。为此,Java提供了一个简化这类操作的关键词finally。 finally是样好东西:不管是否出现了异常,Finally保证在try/catch/finally块结束之前,执行清理任务的代码总是有机会执行。遗憾的是有些人却不习惯使用finally。 当然,编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常?这

44、是执行清理任务的最后机会,尽量不要再有难以处理的错误。 结论三:保证所有资源都被正确释放。充分运用finally关键词。反例之四:不说明异常的详细信息 代码:3行-18行。 仔细观察这段代码:如果循环内部出现了异常,会发生什么事情?我们可以得到足够的信息判断循环内部出错的原因吗?不能。我们只能知道当前正在处理的类发生了某种错误,但却不能获得任何信息判断导致当前错误的原因。 printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程,但只提供了一些最基本的信息,未能说明实际导致错误的原因,同时也不易解读。 因此,在出现异常时,最好能够提供一些文字信息,例如当前正在执行的类、方法

45、和其他状态信息,包括以一种更适合阅读的方式整理和组织printStackTrace提供的信息。 结论四:在异常处理模块中提供适量的错误原因信息,组织错误信息使其易于理解和阅读。 反例之五:过于庞大的try块 代码:3行-14行。 经常可以看到有人把大量的代码放入单个try块,实际上这不是好习惯。这种现象之所以常见,原因就在于有些人图省事,不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体类型是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大箱子,虽然东西是带上了,但要找出来可不容易。 一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明

46、Exception,而不是分离各个可能出现异常的段落并分别捕获其异常。这种做法为分析程序抛出异常的原因带来了困难,因为一大段代码中有太多的地方可能抛出Exception。 结论五:尽量减小try块的体积。 反例之六:输出数据不完整 代码:7行-11行。 不完整的数据是Java程序的隐形杀手。仔细观察这段代码,考虑一下如果循环的中间抛出了异常,会发生什么事情。循环的执行当然是要被打断的,其次, catch块会执行?就这些,再也没有其他动作了。已经输出的数据怎么办?使用这些数据的人或设备将收到一份不完整的(因而也是错误的)数据,却得不到任何有关这份数据是否完整的提示。对于有些系统来说,数据不完整可

47、能比系统停止运行带来更大的损失。 较为理想的处置办法是向输出设备写一些信息,声明数据的不完整性;另一种可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一次性输出。 结论六:全面考虑可能出现的异常以及这些异常对执行流程的影响。 改写后的代码 根据上面的讨论,下面给出改写后的代码。也许有人会说它稍微有点?嗦,但是它有了比较完备的异常处理机制。 OutputStreamWriter out = . java.sql.Connection conn = . try Statement stat = conn.createStatement(); ResultSet rs = stat.exe

48、cuteQuery( select uid, name from user); while (rs.next() out.println(ID: + rs.getString(uid) + ,姓名: + rs.getString(name); catch(SQLException sqlex) out.println(警告:数据不完整); throw new ApplicationException(读取数据时出现SQL错误, sqlex); catch(IOException ioex) throw new ApplicationException(写入数据时出现IO错误, ioex); f

49、inally if (conn != null) try conn.close(); catch(SQLException sqlex2) System.err(this.getClass().getName() + .mymethod - 不能关闭数据库连接: + sqlex2.toString(); if (out != null) try out.close(); catch(IOException ioex2) System.err(this.getClass().getName() + .mymethod - 不能关闭输出文件 + ioex2.toString(); 本文的结论不是放

50、之四海皆准的教条,有时常识和经验才是最好的老师。如果你对自己的做法没有百分之百的信心,务必加上详细、全面的注释。 另一方面,不要笑话这些错误,不妨问问你自己是否真地彻底摆脱了这些坏习惯。即使最有经验的程序员偶尔也会误入歧途,原因很简单,因为它们确确实实带来了“方便”。所有这些反例都可以看作Java编程世界的恶魔,它们美丽动人,无孔不入,时刻诱惑着你。也许有人会认为这些都属于鸡皮蒜毛的小事,不足挂齿,但请记住:勿以恶小而为之,勿以善小而不为。下面是一些 java异常集 算术异常类:ArithmeticExecption空指针异常类:NullPointerException类型强制转换异常:Cla

51、ssCastException数组负下标异常:NegativeArrayException数组下标越界异常:ArrayIndexOutOfBoundsException违背安全原则异常:SecturityException文件已结束异常:EOFException文件未找到异常:FileNotFoundException字符串转换为数字异常:NumberFormatException操作数据库异常:SQLException输入输出异常:IOException方法未找到异常:NoSuchMethodExceptionjava.lang.AbstractMethodError抽象方法错误。当应用试图

52、调用抽象方法时抛出。java.lang.AssertionError断言错。用来指示一个断言失败的情况。java.lang.ClassCircularityError类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出该异常。java.lang.ClassFormatError类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。java.lang.Error错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。java.lang.ExceptionInInitializerError

53、初始化程序错误。当执行一个类的静态初始化程序的过程中,发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。java.lang.IllegalAccessError违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。java.lang.IncompatibleClassChangeError不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新编译而直接运行的情况下,容易引发该错误。java.lang.Instantia

54、tionError实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.java.lang.InternalError内部错误。用于指示Java虚拟机发生了内部错误。java.lang.LinkageError链接错误。该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译所有的类,进而引发错误的情况。java.lang.NoClassDefFoundError未找到类定义错误。当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。java.lang.NoSuchFieldError域不存在

55、错误。当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。java.lang.NoSuchMethodError方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。java.lang.OutOfMemoryError内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。java.lang.StackOverflowError堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。java.lang.ThreadDeath线程结束。当调用Thread类的stop方法时抛出该错误,用于指示线程结束。j

56、ava.lang.UnknownError未知错误。用于指示Java虚拟机发生了未知严重错误的情况。java.lang.UnsatisfiedLinkError未满足的链接错误。当Java虚拟机未找到某个类的声明为native方法的本机语言定义时抛出。java.lang.UnsupportedClassVersionError不支持的类版本错误。当Java虚拟机试图从读取某个类文件,但是发现该文件的主、次版本号不被当前Java虚拟机支持的时候,抛出该错误。java.lang.VerifyError验证错误。当验证器检测到某个类文件中存在内部不兼容或者安全问题时抛出该错误。java.lang.V

57、irtualMachineError虚拟机错误。用于指示虚拟机被破坏或者继续执行操作所需的资源不足的情况。java.lang.ArithmeticException算术条件异常。譬如:整数除零等。java.lang.ArrayIndexOutOfBoundsException数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。java.lang.ArrayStoreException数组存储异常。当向数组中存放非数组声明类型对象时抛出。java.lang.ClassCastException类造型异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B

58、的实例时抛出该异常。该异常经常被称为强制类型转换异常。java.lang.ClassNotFoundException找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。java.lang.CloneNotSupportedException不支持克隆异常。当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。java.lang.EnumConstantNotPresentException枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象,但该枚举对象并不包含常量时,

59、抛出该异常。java.lang.Exception根异常。用以描述应用程序希望捕获的情况。java.lang.IllegalAccessException违法的访问异常。当应用试图通过反射方式创建某个类的实例、访问该类属性、调用该类方法,而当时又无法访问类的、属性的、方法的或构造方法的定义时抛出该异常。java.lang.IllegalMonitorStateException违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。java.lang.IllegalStateException违法的状态异常。当在Java

60、环境和应用尚未处于某个方法的合法调用状态,而调用了该方法时,抛出该异常。java.lang.IllegalThreadStateException违法的线程状态异常。当县城尚未处于某个方法的合法调用状态,而调用了该方法时,抛出异常。java.lang.IndexOutOfBoundsException索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。java.lang.InstantiationException实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。java.lang.InterruptedExc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论