Java基础第7章异常处理_第1页
Java基础第7章异常处理_第2页
Java基础第7章异常处理_第3页
Java基础第7章异常处理_第4页
Java基础第7章异常处理_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、第七章异常处理为了构建健壮、灵活的代码,异常就是程序员必须要面对的问题。异常处理也因此成为了衡量代码优劣的重要尺度。当程序产生异常,能够启用相应的异常处理程序进行异常处理,使得程序能够继续运行下去。本章学习目标:了解异常的基本常识熟悉异常处理的基本原则掌握如何创建和使用自定义异常处理程序7.1 异常的基本概念发现错误的最佳时机是在编译阶段,也能使系统的维护代价降到最低。但是,编译期间不可能找出所有的错误,原因就在于:对于JAVA语言来说,编译过程的本身除了把源程序编译成JAVA虚拟机能够执行的.class字解码文件外,仅仅对程序进行语法性验证。剩下的问题就必须在运行期间去解决。这就需要通过某种

2、方式,把错误源的相关信息传递给某个错误处理者。JAVA异常处理机制也因此而诞生了。gxy7.1.1 什么是异常在程序运行时,打断正常程序流程的任何不正常的情况称为错误或异常。“异常处理”的实现,最早可以追溯到20世纪60年代的操作系统。经过几十年的积累,才使得“异常处理”被正式的纳入语言的范畴。一个“注重实效的程序员”是不应该回避异常处理的。但是很可惜,或许异常处理真的很困难吧。大家都有意、无意的回避了其中的一些异常。这是很不负责任的做法。7.1.2 JAVA标准异常JAVA中的Throwable类是所有异常类的顶级父类,并且有两个直接子类。一个是Error类,另一个是Exception类。这

3、两个子类代表JAVA异常的两种类型。Error用来表示编译时和系统错误,Exception是与编程有关的所有类的父类,是可以被抛出异常的基本类型。而JAVA程序员所关心也就是Exception类型的异常。如果您看过SUN官方的JAVA文档会发现:其实所有的异常类,除了类名不同外,其它的内容都极其的相似。所以要想写出优雅的异常处理程序,关键是要理解JAVA异常概念以及如何在恰当的时间应用它。7.1.3 JAVA异常处理机制JAVA程序的执行过程中如果出现异常,就会有几件事随之发生。首先,自动生成一个异常类的对象,该对象包含了有关异常的基本信息,然后当前执行路径被终止,并且从当前环境中弹出异常对象

4、的引用(其实这个异常对象的引用是被自动提交给JAVA运行时系统的),这个过程称为“抛出异常”。当JAVA运行时系统接收到异常对象时,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,这个过程称为“异常捕获”。7.2 捕获异常首先让我们先看一个简单的示例。例7.1 :public class firstExceptionpublic static void main(String args)int temp1 = 20;int temp2 = 0;System.out.println(temp1/temp2);System.out.println(上面因为除数为零,所以应该对异常进行处理,

5、否则本行将不能输出);编译:javac firstException.java运行:java firstException这时程序就终止了,并抛出一个JAVA运行时捕获的异常,内容如下:Exception in thread main java.lang.ArithmeticException: / by zero at firstException.main(firstException.java:7)这段提示的意思是:在main线程中产生了一个java.lang.ArithmeticException异常:原因是除数为0,错误代码在firstException.java这个文件的第7行。(

6、线程的概念将在后面的章节进行讲解。)。下面我们对程序进行一下修改并保存,使之能够正常运行。例7.2 :public class firstExceptionpublic static void main(String args)int temp1 = 20;int temp2 = 0;trySystem.out.println(temp1/temp2);catch(ArithmeticException e)System.err.println(我是一个异常);System.out.println(上面因为除数为零,所以应该对异常进行处理,否则本行将不能输出);编译:javac firstEx

7、ception.java运行:java firstException结果:我是一个异常上面因为除数为零,所以应该对异常进行处理,否则本行将不能输出虽然负数开平方绝对是不可以的,但是JAVA运行时系统却不会捕获该异常,只是把开平方的结果赋予NaN值。这个NaN是“Not a Number”,即非数值(也有称其为“不确定式”的,但是非数值可能更合适一些)。但是比较有意思的是JAVA本身对NaN本身的定义,如下:publicstaticfinaldoubleNaN;因为对NaN的讨论已经超出本书的范围,所以在此不进行详细讨论,但是读者应该知道的是:即便两个NaN值也是不相等的。下面这个例子就能很好的

8、说明这个问题:例7.3 :public class tempdouble a = -10;a = Math.sqrt(a);System.out.println(a);System.out.println(a = a);double b = Double.NaN;System.out.println(b);System.out.println(b = b);编译:javac temp.java运行:java temp结果: NaN FalseNaN False从firstException.java这个例子不难看出,异常捕获是在try块中进行的。try块中是可能产生异常的代码,这段代码在JAV

9、A中称为监控区(guarded region)。而异常处理是在catch()中进行的。对于异常处理程序来说,一个try块对应着一个或多个catch()块,和一个在语法上可有可无的finally块。但是程序一旦包含了finally块,则不管是否发生异常,finally块里的语句是一定要执行的。乍看上去有一点像现实中的“霸王条款”。但正是这个貌似“霸王条款”的finally块,它对于引入了“垃圾回收”机制的JAVA来说,有着极其特殊的价值。因为“垃圾回收”是由JVM控制的,我们不知道也不可能控制回收的时间。对于像已经使用完或无效的数据库连接这样占用系统大量宝贵资源的“垃圾”来说,必须要在第一时间将

10、其释放。这时候JVM的“垃圾回收”机制的处理能力就显得有些苍白,在Web应用上更是如此。这时如果程序中加上了一个finally块,并且在里面加上一行释放连接的代码,问题就很简单的解决了。下面的这个小程序能有助于读者对异常处理的理解。程序功能描述:定义一个可以实现统计前N名学生的平均成绩的方法。要求方法能接受学生成绩表和计算平均成绩的学生个数这两个参数。其中成绩表为整型数组,学生人数为普通的整型变量,实现如下:例7.4 :public class exampleExceptionpublic static void main(String args)int grades = new int95,

11、80,65,78,58;/计算前10名学生的成绩。countAverage(grades,10);public static double countAverage(int grades,int total)int sum = 0;double ave = 0.0;boolean judge = false;tryfor(int i = 0;i total;i+)sum += gradesi;ave = (double)sum/total;catch(ArithmeticException e)/其他的处理代码System.err.println(total为零,不能计算);judge = t

12、rue;catch(ArrayIndexOutOfBoundsException e)/其他的处理代码System.err.println(统计的学生个数超出成绩表中的学生总人数);judge = true;finally/其他的处理代码System.err.println(不管程序是否有异常,我都将会输出);if(judge = true)System.err.println(因为参数有误,将返回0.0);return 0.0;elsereturn ave;保存为exampleException.java编译:javac exampleException.java运行:java exampl

13、eException程序结果为:统计的学生个数超出成绩表中的学生总人数不管程序是否有异常,我都将会输出因为参数有误,将返回0.0读者可以试着把return语句放到try块中或者catch()块中,然后把finally块中的关于返回值的语句去掉。看看程序能否通过编译并且正常运行。7.3 创建自定义异常房地产开发商根据市场部调查来的结果,最终抽象出适合某一类型用户群的商品房模型。经过施工使模型成为现房。而有该类型需求的用户,在购买完商品房后,不可避免的要对其进行装修:该掏壁橱的地方掏壁橱、该铺地毯的地方铺地毯,最终设计出一套适合自己的住房。这样做的原因很简单。从开发商的角度来讲:他只能根据用户群的

14、需求,建一个比较符合用户要求的“筒子楼”。而不可能为每一个用户量身定做住房(当然如果付得起费用的话,这也有可能)。这其中最主要的原因是:开发商在时间上耗不起。从用户的角度来讲:一屋子的水泥墙,连个床都没有。所以装修也就避不可少了。与现实中的房地产开发商比起来,SUN为JAVA异常这群“用户”定制的“JDK筒子楼”要高明得多:里面有“床”、有“空调”、有“有电视”。但是不管怎样,它依然是“筒子楼”,所以就不可避免的满足不了我们所有的要求。另外有些功能也不是我们所希望的那样。基于这点,创建自定义异常就势在必行。但是读者需要知道的是:我们是在为“JDK筒子楼”装修,而非重建。所以我们要“extend

15、s Exception”。另外,在为“JDK筒子楼”装修前,还是看看都提供了那些主要功能吧。Java.lang软件包中的异常ExceptionClassNotFoundExceptionClassNotSupportedExceptionIllegalAccessExceptionInstantiationExceptionInterruptedExceptionNoSuchMethodExceptionRuntimeExceptionArithmeticExceptionArrayStoreExceptionIllegalArgumentExceptionIllegalThreadState

16、ExceptionNumberFormatExceptionIllegalMonitorStateExceptionIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionString IndexOutOfBoundsExceptionNegativeArraySizeExceptionNullpointerExceptionSecurityException上面所列出的java.lang包中提供的这些异常基本能够满足初学者的使用需求。其余包中的异常请参照相关资料。如果书中的示例程序需要用到其它包中的异常,将给出特别的说明和解释。另外读者需

17、要知道的是:异常的类库也在不断的扩大中,而且在第三方的异常库中依然可能存在其他的异常。在使用的时候如果出现了奇怪的异常,则应该特别注意了。Java的JDK中所提供的异常类数以百计。程序员不可能也没有必要将它们全部记住,用的时候可以去查手册,里面有非常详细的信息。而如果仅仅是要找到一个合适的异常类却有一个很简单也很巧妙的办法:把可能产生该类异常的代码放到一个main()方法中,并且把代码设置成一定会抛出异常的状态。这样我们就能在运行该段代码时,看到系统给出的提示。下面给出一个小例子将有助于对上面叙述的理解:例7.5 :public class demopublic static void mai

18、n(String args)int temp1 = 3;int temp2 = 0;/除数为零,所以肯定会出现异常。System.out.println(temp1/temp2);保存为:demo.java编译:javac demo.java运行:java demo结果:Exception in thread main java.lang.ArithmeticException: / by zero at demo.main(demo.java:7)这样我们就找到了除数为零是属于哪个异常了。而这种方法对于不知道异常属于什么类型的情况则更为有用。在创建用户自定义异常之前,有必要简单了解一下Exc

19、eption类的原型。Exception类有两个构造器:public Exception();public Exception(String msg);下面将创建并使用一个自定义异常类。这也是在exampleException类基础上进行改写的。/创建自定义异常类:例7.6 :public class myException extends Exceptionpublic myException()public myException(String message)super(message);/重写父类的getMessage()方法public String getMessage()retu

20、rn super.getMessage() + countAverage(int grades,int total);例7.7 :class firstExceptionpublic static double countAverage(int grades,int total)throws myExceptionint sum = 0;double ave = 0.0;boolean judge = false;if(total grades.length)throw new myException(人数不能大于成绩表中的总人数);elsefor(int i = 0;i total;i+)s

21、um += gradesi;return (double)sum/total;例7.8 :class testpublic static void main(String args)int grades = new int95,80,65,78,58;/计算前10名学生的成绩。tryfirstException.countAverage(grades,10);catch(myException e)System.out.println(n下面将调用自定义异常重写的getMessage()方法,来输出异常的内容);System.err.println(e.getMessage();System.

22、out.println(n下面调用系统为父类定义的printStackTrace()来输出相关信息);e.printStackTrace();e.getLocalizedMessage();保存为:myException.java编译:javac myException.java运行:java test结果:下面将调用自定义异常重写的getMessage()方法,来输出异常的内容人数不能大于成绩表中的总人数countAverage(int grades,int total)下面调用系统为父类定义的printStackTrace()来输出相关信息myException: 人数不能大于成绩表中的总

23、人数countAverage(int grades,int total) at firstException.countAverage(myException.java:29) at test.main(myException.java:49)从上面的例子不难看出,要创建自定义的异常类,其实很简单。它与普通类的创建方法一样。只不过自定义的异常类必须继承Exception或Exception的子类(虽然建议要继承的父类,越接近该类型的异常越好。但是在实际编写代码的时候,却往往是继承Exception。原因就是:从Exception继承而来的自定义异常类,绝大多数情况都能满足程序员的需要。而如果真

24、的能找到这个接近该类型的异常类,往往就没有必要去编写自定义的异常类了)。例7.9 :这样我们就得出了一个创建自定义异常类的模型:/*因为自定义异常往往是单独放在一个包中,为了能够被不同的包所引用,最好定义为public类型*/public class userExceptionName extends Exception/构造器public userExceptionName();public userExceptionName(Sgring msg)super(msg);/重写getMessage()方法public String getMessage()/自定义的代码/也可以自定义一些自己

25、特殊的方法这里要说明一下:因为我们不能保证我们“装修好了的筒子楼”没有别人住,所这两个构造器最好全都定义出来。当然还可以根据需要,再重载几个构造器以供使用。另外getMessage()方法不一定要进行重载。如果我们需要更详细的信息,可以调用Throwable类(它是Exception类的父类)的public void printStackTrace()方法。其实public void printStackTrace()方法还有两个重栽版本,分别是:public void printStackTrace(PrintStream)public void printStackTrace(java.i

26、o.PrintWriter)关于这个方法更详细的说明请参照其他资料。在这里就不赘述了。创建完自定义异常类后,接下来就是如何来使用它。很显然“JDK筒子楼”不可能预料到我们会如此“装修”它,也就不可能预先抛出该类型的异常。所以在使用自定义异常前,还应知道知道该如何抛出自定义异常。访问修饰限制符 static 返回类型 方法名(参数) throws useExceptionName/自定义的代码if()throw useExceptionName(可能的原因) ;其中throws为异常声明。有点类似于C语言中的函数声明,目的就是告诉机器:我可能会抛出这样的异常,而且不管我是否抛出这类异常你都应该对

27、这(些)类型的异常进行检测。当然,既然说是“可能会”,那么也就“可能不会”的情况发生,甚至真的在方法的实现中不抛出这类异常(但是调用该方法的时候必须对声明的抛出异常进行捕获。否则将不能通过编译)。这样做的好处有两个。第一个是:这样做能够使调用者知道使用该方法可能会面临什么样的问题,进而进行补救;第二个好处是:如果我们定义的是抽象类或接口时声明了要抛出的异常,那么派生类或接口的实现就能够抛出这些预先声明的异常了(这些被声明的异常类必须是已经定义好的,否则程序是不能通过编译的)。但是作为初学者需要知道的是:我们不可能预见所有的异常,所以设计出了糟糕的异常声明也不要气馁。因为“任何进步都是需要代价的

28、”,只要有勇气去做、去尝试就够了。或许读者会问“自定义异常真的这么简单吗”。答案是肯定的。而且JDK中所定义的异常类,有些甚至会更简单些。这并不是那些JAVA开发者的知识不够渊博,而是因为设计异常类所追求的目标就是尽可能简练地返回错误信息,以帮助程序员更好地调试程序。所以试图设计功能强大且十分华丽的自定义异常类的做法是非常不可取的。那样做不但违背了提出异常概念的初衷,而且使代码变得更加晦涩难懂。7.4 异常的尴尬或许这个标题有点难以理解。这么优秀的概念也有尴尬吗?回答是肯定的,而且异常的尴尬程度与程序员对异常功能的期盼是成正比的。因为异常处理并不是万能的,它仅仅是保障程序正常运行的最后屏障。要

29、想构建健壮灵活的代码,异常的确是必不可少的。但是最主要的确是在编码前期进行的“需求分析”、“需求定义”、“功能模块的划分”,因为这些才是构建健壮代码的基石。试想一下:地基已经倾斜的“比萨城斜塔”,即便在当今科技的鼎力支持下进行的补救措施,依然不能阻止它继续倾斜。那么,我们还敢期盼异常处理的补救工作真的能够“起死回生”吗?作为语言的一个功能模块,异常依然有着自己缺点和不足。下面将对此进行详细的说明,并给出相应的解决办法。运行一些大型软件的时候,偶尔会出现文件丢失的现象。而异常也同样面临着丢失的危险。前者的发生频率是“sometimes”,而后者如果程序员不加注意的话却是“often”甚至是“al

30、ways”。异常丢失有些可能是语言本身的问题,但大多数是人为造成的。看一看下面的例子:例7.10 :class lostException extends Exceptionpublic lostException()public lostException(String msg)super(msg);public class testLostExceptionpublic static void main(String args)trymethod_b(); catch(Exception e)e.printStackTrace();public static void method_a()

31、 throws lostExceptionthrow new lostException(这个异常将被丢失);public static void method_b() throws Exceptiontrymethod_a();finally/除数为零,将抛出一个异常System.out.println(3/0);保存为:testLostException.java编译:javac testLostException.java运行:java testLostException结果:java.lang.ArithmeticException: / by zero at testLostExce

32、ption.method_b(testLostException.java:35) at testLostException.main(testLostException.java:13)很显然我们的“losteException”这个异常真的丢失了,但是程序的的确确抛出了这个异常!或许我们应该期盼编译器能够做这样的检测:如果在finally块前没有catch()块,则程序就不能通过编译。或者程序员直接在finally块前加上一行代码:catch(Exception e)。也的确有好多人是这么做的(对于声明了会抛出N个异常的方法来说,这个处理是必要的)。但是很遗憾这又违背了异常处理的另一条准则

33、:仅仅捕获自己能够处理的异常。从这个角度来说编译器做的没有错,程序员也没有错,准则更没有错。或许错就错在:我们不应该奢望编写非常优雅的异常处理代码,进而能够“起死回生”。我们不希望违背准则,但是遇到了真的无法“忽略”的异常该怎么做呢?捕获它,然后向调用该段代码的上一级抛出该异常。还有一种方法就是异常链。异常链不是向上级重新抛出该异常,而是将异常信息保存起来以供调试用。这两种方法也是JAVA语言本身,现在所能做出的最完美的补救措施。而作为程序员,我们还可以在捕获异常后,调用printStackTrace()方法,将错误信息输出,然后寻求别的帮助。切不可捕获自己无法处理却又必须捕获的异常,然后写一

34、个空处理方法。这样做的后果是:除非去检察源码,否则异常将永远丢失!下面就简单的介绍一下什么是“重新抛出异常”,和JAVA中异常链的概念。其实“重新抛出异常”也不是什么新事物。所谓“重新抛出”就是catch块里捕获了该异常,不编写(因为我们处理不了这个异常)异常处理代码,而是将它“throw”出去。但是需要注意的一点是:一旦catch块中重新抛出了异常,则接下来的异常处理就不能进行了。当上一级异常处理程序捕获该异常时,用printStackTrace()方法输出的异常信息依然是原来抛出点的信息,而并非重新抛出点的信息。要想更新该信息的话,可以用fillInStackTrace()方法。但是需要注

35、意的是:重新抛出的异常是Throwable类型的(也就是所有异常的父类。有些读者可能会问为什么不是Exception类型的呢?不是因为JAVA语言本身硬性规定的,而是因为我们重新抛出的异常的确可能是任何类型的。所以将抛出类型定义为Throwable也就可以理解了),所以在异常声明和捕获的时候都得是Throwable下面的示例程序将有助于理解:例7.11:class rethrowException extends Exceptionpublic rethrowException()public rethrowException(String msg)super(msg);public clas

36、s testRethrowExceptionpublic static void main(String args)tryrethrowExceptionMethod(); catch(Throwable e)/捕获“重新抛出异常”,输出异常信息e.printStackTrace();public static void method() throws rethrowExceptionthrow new rethrowException(这个异常将被重新抛出);public static void rethrowExceptionMethod() throws Throwabletrymeth

37、od();catch(Exception e)/输出原始的异常信息e.printStackTrace();/更新异常信息,并重新抛出该异常throw e.fillInStackTrace();保存为:testRethrowException.java编译:javac testRethrowException.java运行:java testRethrowException结果:rethrowException: 这个异常将被重新抛出 at testRethrowException.method(testRethrowException.java:24) at testRethrowExcept

38、ion.rethrowExceptionMethod(testRethrowException.java:30) at testRethrowException.main(testRethrowException.java:13)rethrowException: 这个异常将被重新抛出 at testRethrowException.rethrowExceptionMethod(testRethrowException.java:38) at testRethrowException.main(testRethrowException.java:13)从结果我们不难发现,更新异常信息成功了。也

39、就是说如果不调用fillInStackTrace()方法,而直接“throw e;”则还是原来的异常信息,然后就可以在catch块中处理这个“重新抛出的异常”。读者可以把代码中的throw e.fillInStackTrace()替换成throw e来体会一下。7.5 异常使用的注意事项7.5.1 异常匹配异常匹配不但是一个匹配原则问题,更是编译器的硬性规定。catch块中,如果捕获了一个异常后,则在该catch块后面继续捕获的异常,必须是与该异常类的级别一样、或者是该类的父类。否则编译时是不能通过的。下面的小示例将有助于理解。例7.12 :public class temp extends

40、Exceptionpublic temp()public temp(String msg)super(msg);class testpublic static void main(String args)tryoutput();catch(temp e)System.out.println(在catch(temp e)中捕获的异常);e.printStackTrace();catch(Exception e)e.printStackTrace();public static void output() throws tempthrow new temp(抛出temp异常);保存为temp.ja

41、va编译:javac temp.java运行:java test您可能会发现程序运行没有问题。但是如果把粗体字中的代码调换一下位置,问题就出现了。当编译的时候会出现如下错误提示:temp.java:18: exception temp has already been caught catch(temp e) 1 error很显然temp异常类为Exception类的子类,这个示例程序也刚好符合我们上面的“异常匹配原则”。本章小结异常的确是一个很优秀的概念。但是需要注意的是:它的系统开销非常大。所以如果进行简单判断就能处理的问题,就不要编写异常处理代码。尤其是自己编写的代码是处在系统的最底层,

42、则更应该注意这样的问题。因为异常越接近底层,系统所承担的负担也就越大。另外在做大型的软件开发时,过多的异常处理反而会降低开发效率,而代码质量甚至毫无提高。1) 如果可以通过简单的判断就能处理错误,则不要使用异常2) 只有在知道如何处理的情况下才捕获异常。(这和捕获异常却不处理异常不同)3) 在异常中进行少许的修正,然后绕过异常发生的地方继续执行。4) 把当前环境下能完成的任务尽量完成。然后将异常向高层抛出。5) 如果不知道该如何处理,则终止程序。本章练习1 以下程序运行的结果是:1. public class Test 2. public static void main(String arg

43、s) 3. try 4. return;5. finally 6. System.out.println( “Finally” );7. 8. 9. A. FinallyB. 编译错误。C. 可以运行但没有结果。D. 运行时抛出异常。2 以下程序运行的结果是:1. public class X 2. public static void main(String args) 3. try 4. badMethod();5. System.out.print(“A”);6. 7. catch (Exception ex) 8. System.out.print(“B”);9. 10. finall

44、y 11. System.out.print(“C”);12. 13. System.out.print(“D”);14. 15. public static void badMethod() 16. throw new RuntimeException();17. 18. A. ABB. BCC. ABCD. BCDE. Compilation fails3 以下程序的运行结果是:1. public class X 2. public static void main(String args) 3. try 4. badMethod();5. System.out.print(“A”);6.

45、 7. catch (Exception ex) 8. System.out.print(“C”);9. 10. finally 11. System.out.print(“B”);12. 13. System.out.print(“D”);14. 15. public static void badMethod() 16. throw new Error();17. 18. A. ABCDB. 编译错误。C. 输出C。4 以下程序的运行结果是:Given:1. class Exc0 extends Exception 2. class Exc1 extends Exc0 3. public

46、class Test 4. public static void main(String args) 5. try 6. throw new Exc1();7. catch (Exc0 e0) 8. System.out.println(“Ex0 caught”);9. catch (Exception e) 10. System.out.println(“exception caught”);11. 12. 13. What is the result?A. Ex0 caughtB. exception caughtC. 编译错误。5 以下程序的输出结果是:1. public class T

47、est 2. private static int x;3. public static void main(String args) 4. System.out.println(x0);5. 6. A. 0B. nullC.编译错误。D. 抛出NullPointerException异常。E. 抛出 ArrayIndexOutOfBoundsException异常。6 参看以下程序:1. public class test(2. public static void main(stringargs)3. string foo = args 1;4. string foo = args 2;5

48、. string foo = args 3;6. 7. 如果运行时采用以下语句运行:Java Test red green blue程序将输出什么结果?A. 程序不能编译。B. 程序运行但没有结果。C. 程序抛出异常。第七章练习答案1、答案是:A。finally语句中的内容一定会执行。2、答案是:D。当方法抛出异常时被catch块捕获,然后运行finally语句的内容。3、答案是:B。catch语句可以处理Exception类及其子类,但是不能处理Error。4、答案是:A。catch语句的就近匹配原则。当出现第一个匹配的内容时不会再进行匹配了。5、答案是:D。数组没有初始化,所以抛出相应的异

49、常。6、答案是:C。数组下标从0开始到n-1结束。所以此程序访问不到args3。薃肀莂蒃袂肀肂虿袈聿芄薂螄肈莇螇蚀肇葿薀罿肆腿莃袅肅芁薈螁膄莃莁蚇膄肃薇薃膃芅荿羁膂莈蚅袇膁蒀蒈螃膀膀蚃虿腿节蒆羈芈莄蚁袄芈蒆蒄螀芇膆蚀蚆袃莈蒃蚂袂蒁螈羀袁膀薁袆袁芃螆螂袀莅蕿蚈衿蒇莂羇羈膇薇袃羇艿莀蝿羆蒂薆螅羅膁蒈蚁羅芄蚄罿羄莆蒇袅羃蒈蚂螁羂膈蒅蚇肁芀蚁薃肀莂蒃袂肀肂虿袈聿芄薂螄肈莇螇蚀肇葿薀罿肆腿莃袅肅芁薈螁膄莃莁蚇膄肃薇薃膃芅荿羁膂莈蚅袇膁蒀蒈螃膀膀蚃虿腿节蒆羈芈莄蚁袄芈蒆蒄螀芇膆蚀蚆袃莈蒃蚂袂蒁螈羀袁膀薁袆袁芃螆螂袀莅蕿蚈衿蒇莂羇羈膇薇袃羇艿莀蝿羆蒂薆螅羅膁蒈蚁羅芄蚄罿羄莆蒇袅羃蒈蚂螁羂膈蒅蚇肁芀蚁薃肀莂蒃

50、袂肀肂虿袈聿芄薂螄肈莇螇蚀肇葿薀罿肆腿莃袅肅芁薈螁膄莃莁蚇膄肃薇薃膃芅荿螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆

51、薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀

52、袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇

53、蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁

温馨提示

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

评论

0/150

提交评论