再现理想 发表于 2015-1-18 11:43:01

JAVA编程:Java中非常机制的深切研讨

JAVA是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由升阳(SunMicrosystems)公司的詹姆斯·高斯林(JamesGosling)等人于1990年代初开发。因为本文旨在切磋Java"非常机制"的深层道理,因而关于"非常"的利用办法都不做具体申明。起首看一段十分熟习的用于翻开一个文件的C程序段:

FILE*fp;
fp=fopen(filename,"rw");
if(fp==NULL){
printf("cannotopenfile
");
exit(0);
}



在这段程序中,if前提语句中的一段用来处置没有找到指定文件,大概别的缘故原由没法准确翻开指定文件。但是假如碰到一个义务心不强的程序员,他大概以为呈现找不到文件的大概性很小,大概因为思绪会合在程序功效的完成上而健忘了处置这类情形。这时候程序一样能够准确编译,并且一样平常情形下也不会呈现成绩。但此时这段程序能够一定说是不敷强健的,并且一旦这段程序产生了毛病也会让程序员很难发明毛病出在那里。在C言语和别的年夜多半初级言语中都能够举出良多这类例子。

也就是一个函数在利用的时分,大概会呈现并没有到达这个函数的利用目标的情形,哪怕在这段程序的特定利用情况下产生这类非常情形的大概性只要万分之一。经常使用处置的办法就是,程序员在必要利用某个函数时必需充实懂得大概会有甚么缘故原由招致该函数不克不及准确实行,然后到场响应的前提判别语句来举行处置。前面将有一个例子申明这个成绩。

而Java的"非常机制"就是在处置上述成绩中给了程序员十分复杂而天真的体例。一样平常来讲,别的初级言语次要是让函数利用者来存眷该函数大概会呈现的非常情形,而java则是把这件事变交给办法(和函数对应的观点,在Java中称办法)的计划者来做。这关于办法的利用者来讲带来的便利是不会由于义务心不强,大概做事丢三那四,会忘了在利用办法时处置大概产生的非常情形。而贫苦就是,在利用一个大概会产生非常的办法时,相对不克不及置若罔闻,而必需做出响应的处置。也就是说象上述C程序段中,假如忘了if程序块,这个程序乃至还能蒙过一个内行下属,但当利用Java来完成这个功效时,只需用到的办法利用了"非常"机制,假如不合错误大概发生"非常"的办法举行响应处置,java编译器是不会让其经由过程的。

1、"非常类"的构造情势

Java体系类中的办法发生的非常都被构造成"非常类"(另有Error类,不在本文会商局限),此办法和它相干的"非常类"经由过程throws关头字联系关系在一同,而且这些类都必需是Exception类的子类。任何一个本人开辟的类的办法中假如大概会发生某种非常,也能够将这类非常构造成一个"非常类",但这个"非常类"一样必需是Exception的子类,或孙子类等等。

例1:

/*isLegal于反省数据是不是正当,当>0时视为正当,前往正当值,
*不然视为分歧法,抛出"非常"。*/
intisLegal(intdt)throwsLowZeroException//这类界说本文中均称为办法与"非常"通
{                 //过throws创建了联系关系
if(dt>=0){
returndata;
}
else
thrownewLowZeroException();
}
/*自已写的非常类,承继自Exception*/
classLowZeroExceptionextendsException
{
publicLowZeroException(){
super();
}
}



细心察看办法isLegal(),它表现出的最值得注重的特征是,它有两种体例的函数出口,一种是经由过程return语句,前往的是办法自己界说的范例的实例,另外一种是经由过程throw,前往的是"非常类"的对象实例,Java中称之为抛出"非常"。对照一下C中怎样处置一样的成绩的:

intisLegal(intdt){
if(dt>=0){
returndata;
}
else
return-1;//经由过程一个特定值来标明堕落
}



因为C只能经由过程return前往函数值,以是在处置非常情形时则大概经由过程以上体例来处置。固然这就请求isLegal()函数的利用者必需晓得函数中利用前往值-1来标明呈现分歧法数据的情形。

对照这两种处置办法,能够晓得java的"非常机制"把处置非常事务的本能机能和办法自己的本能机能经由过程两个分歧出口分别开来。

一切这些"非常类"自力于它详细服务的办法被一致构造成一个类树。"非常机制"就比如高校的后勤社会化一样,经由过程后勤社会化将黉舍的教授教养本能机能和黉舍的后勤保证分别开来,而且后勤团体的构造情势也是自力于黉舍主体的。现实证实,这类构造体例不但进步了服务效力,也进步了服务质量。全部Java系统中的"非常类"构造情势如所示:







在例1中的isLegal()办法假如在挪用过程当中没有能一般前往整形数,而是在"非常"发生点发生了"非常"对象,那末这个"非常"对象由谁来吸收,并处置它呢?以下就来解答这个成绩。

2、"非常"的处置历程

Java中由try…catch语法来处置"非常",将联系关系有"非常类"的办法包括在try{}程序块中,catch(){}关头字可使用形参,用于和办法发生的"非常"对象分离。当挪用某个办法时,引发非常事务产生的前提建立,便会抛出"非常",本来的程序流程将会在此办法处中止,然后try模块后紧跟的catch中的"形参"和此非常对象完成了却合,继而进进了catch模块中运转。详细历程举例申明:

例2:

/*将联系关系有非常的办法包括在try模块中*/
intmyMethod(intdt){
intdata=0;
try{
intdata=isLegal(dt);
}catch(LowZeroExceptione){
System.out.println("产生数据毛病!");
}
returndata;
}



3、"非常"的处置办法

有两种办法处置"非常":第一种如例2,将含有"非常"出口的办法间接放到try块中,然后由紧随厥后的catch块捕获。第二种是不间接监听捕获被援用办法的"非常",而是将这个"非常"联系关系传送给援用办法,同时监听捕获事情也响应向上传送。

例3:

intmyMethod2(intdt)
{
intdata=0;
try{
data=myMethod(dt)
}catch(LowZeroExceptione){
System.out.println("产生数据毛病!");
e.printStackTrace();
}
returndata;
}

intmyMethod(intdt)throwsLowZeroException
{
intdata=isLegal(dt);//此处援用isLegal()办法,但并没有捕获它的"非常"
returndata;
}



从上例中能够看到办法myMethod()与它援用的办法isLegal()发生的"非常"LowZeroException创建了联系关系,也就是完成了将"非常"联系关系的向上传送,此时的myMethod()办法体中固然只要一个return前往语句,但它现实上一样有两种体例的函数出口,一种是由return前往的整形值,另外一种则是前往办法名中的throws关头字所指的"非常类"的实例对象。响应的,监听捕获的事情交给了上一层办法myMethod2()。一样的事理,myMethod2()也能够将"非常"经由过程throws的联系关系持续向上传送。如许的话,一旦一个"非常"被捕获到时,这个"非常"必有一个传送路径,而假如我们在捕获点的catch程序块中到场printStackTrace()办法,便能分明的看到这个"非常"是如何传送过去的。比方在例3假如有"非常"被捕获到,e.printStackTrace()打印出来的了局将是:

LowZeroException:

atExample.isLegal

atExamplemyMethod

atExample.myMethod2

atExamplemain

从上了局中我们能够看到,从LowZeroException"非常"发生点,即包括thrownewLowZeroException();子句的办法入手下手,然后一向追溯到发生以后线程的办法(注重:printStackTrace()并非追溯到捕获点停止,而是到发生以后线程的办法停止)。"非常"发生点发生的LowZeroException"非常"对象,起首被赋给了isLegal()联系关系的LowZeroException类的知名援用,然后持续赋给myMethod()联系关系的LowZeroException类的知名援用,再持续赋给myMethod2()中的catch块中的形参e,最初在这里被处置失落,这个"非常"对象随即消散。能够说,catch(){}就是"非常"对象的性命闭幕点。

别的还要注重一点,办法与"非常"的联系关系能够一向向上传送,当传送到与main办法联系关系后,即在main()办法的界说中利用了throwsException,这时候除假造机没有别的办法可以援用main()办法,且在程序中大概看不到try…catch程序块,但其实不会发生毛病,由于此时假造时机捕获"非常",而且会默许的挪用printStackTrace()办法打印出"非常"路径。总之只需一个办法联系关系了"非常",能够将这个"非常"联系关系向上传送,可是终极必需利用catch来停止"非常",大概一向传送到main()办法交给Java假造机来停止"非常"对象的性命,不然是通不外编译的。

4、利用"非常机制"的必要注重的几点

1.一个办法中大概会发生多种分歧的非常,你能够设置多个"非常"抛出点来办理这个成绩。

2."非常"对象从发生点发生后,到被捕获后停止性命的全过程当中,实践上是一个传值历程,以是你能够依据必要,来公道的把持检测到"非常"的粒度。比方在例3中,假如你其实不必要晓得详细发生的是LowZeroException"非常",那末你可使用"非常"的大众父类Exception来分离"非常"对象,即catch(Exceptione){…}。一样在"非常"与办法联系关系的传送过程当中,也能够依据必要把持联系关系"非常"的粒度,即throws前面跟上非常对象的父类名。

3."非常机制"中另有一种特别情形DDRuntimeException"非常类"(见),这个"非常类"和它的一切子类都有一个特征,就是"非常"对象一发生就被Java假造机间接处置失落,即在办法中呈现throw子句的中央便被假造机捕获了。因而但凡抛出这类"运转时非常"的办法在被援用时,不必要有try…catch语句来处置"非常"。

不得不提一下的是:.net是看到java红,而开发出来的工具。

海妖 发表于 2015-1-21 13:06:19

Java 编程语言的风格十分接近C、C++语言。

柔情似水 发表于 2015-1-30 18:54:25

是一种为 Internet发展的计算机语言

小魔女 发表于 2015-1-30 23:02:49

一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。

飘灵儿 发表于 2015-2-5 13:52:27

科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

谁可相欹 发表于 2015-2-6 16:19:57

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

透明 发表于 2015-2-19 13:49:22

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

不帅 发表于 2015-2-27 15:13:35

接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。

分手快乐 发表于 2015-3-9 07:56:52

Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。

活着的死人 发表于 2015-3-12 11:27:03

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

飘飘悠悠 发表于 2015-3-16 04:10:59

不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。

深爱那片海 发表于 2015-3-22 20:08:13

Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。

乐观 发表于 2015-3-22 20:08:13

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

第二个灵魂 发表于 2015-3-22 20:10:16

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

山那边是海 发表于 2015-4-6 04:08:28

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

冷月葬花魂 发表于 2015-4-6 09:59:58

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

若天明 发表于 2015-4-21 15:26:27

是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言

再见西城 发表于 2015-6-11 22:37:31

Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台

蒙在股里 发表于 2015-6-28 00:52:48

是一种使用者不需花费很多时间学习的语言

愤怒的大鸟 发表于 2015-7-11 02:30:26

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
页: [1] 2
查看完整版本: JAVA编程:Java中非常机制的深切研讨