




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java的异常异常指的是程序运行时出现的非正常情况。在用传统的语言编程时,程序员只能通过函数的返回值来发出错误信息。这易于导致很多错误,因为在很多情况下需要知道错误产生的内部细节。通常,用全局变量errno来存储异常的类型。这容易导致误用,因为一个errno的值有可能在被处理之前被另外的错误覆盖掉。即使最优美的C语言程序,为了处理异常情况,也常求助于goto语句。Java对异常的处理是面向对象的。一个Java的Exception是一个描述异常情况的对象。当出现异常情况时,一个Exception对象就产生了,并放到产生这个异常的成员函数里。1基础Java的异常处理是通过5个关键词来实现的:try,catch,throw,throws和finally。用try来执行一段程序,如果出现异常,系统抛出(throws)一个异常,你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。下面是异常处理程序的基本形式:try /程 序 块 catch (ExceptionType1 e) / 对ExceptionType1的处 理 catch (ExceptionType2 e) / 对ExceptionType2的 处 理 throw(e); /再 抛 出 这 个 异 常 finally 2异常的类型在异常类层次的最上层有一个单独的类叫做Throwable。这个类用来表示所有的异常情况。每个异常类型都是Throwable的子类。Throwable有两个直接的子类。一类是Exception,是用户程序能够捕捉到的异常情况。我们将通过产生它的子类来创建自己的异常。另一类是Error,它定义了那些通常无法捕捉到的异常。要谨慎使用Error子类,因为它们通常会导致灾难性的失败。在Exception中有一个子类RuntimeException,它是程序运行时自动地对某些错误作出反应而产生的。3不捕捉异常异常对象是Java在运行时对某些异常情况作出反应而产生的。例如,下面这个小程序包含一个整数被0除的异常。package com.chinasofti;class Exc0 public static void main(String args) int d = 0;int a = 42 / d;当Java执行这个除法时,由于分母是0,就会构造一个异常对象来使程序停下来并处理这个错误情况,在运行时抛出(throw)这个异常。说抛出是因为它象一个滚烫的马铃薯,你必须把它抓住并立即处理。程序流将会在除号操作符处被打断,然后检查当前的调用堆栈来查找异常。一个异常处理器是用来立即处理异常情况的。在这个例子里,我们没有编一个异常处理器,所以缺省的处理器就发挥作用了。缺省的处理器打印Exception的字符值和发生异常的地点。下面是我们的小例子的输出。Exception in thread main java.lang.ArithmeticException: / by zeroat com.chinasofti.Exc0.main(Exc0.java:6)4 try与catch通常我们希望自己来处理异常并继续运行。可以用try来指定一块预防所有异常的的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的异常的类型。例如,下面的例子是在前面的例子的基础上构造的,但它包含一个try程序块和一个catch子句。package com.chinasofti;class Exc1 public static void main(String args) try int d = 0;int a = 42 / d; catch (ArithmeticException e) System.out.println(division by zero);catch子句的目标是解决异常情况,把一个变量设到合理的状态,并象没有出错一样继续运行。如果一个子程序不处理某个异常,则返到上一级处理,直到最外一级。5多个catch子句在某些情况下,同一段程序可能产生不止一种异常情况。你可以放置多个catch子句,其中每一种异常类型都将被检查,第一个与之匹配的就会被执行。如果一个类和其子类都有的话,应把子类放在前面,否则将永远不会到达子类。下面是一个有两个catch子句的程序的例子。package com.chinasofti;class MultiCatch public static void main(String args) try int a = args.length;System.out.println(a = + a);int b = 42 / a;int c = 1 ;c42 = 99; catch (ArithmeticException e) System.out.println(div by 0: + e); catch (ArrayIndexOutOfBoundsException e) System.out.println(array index oob: + e);如果在程序运行时不跟参数,将会引起一个0做除数的异常,因为a的值为0。如果我们提供一个命令行参数,将不会产生这个异常,因为a的值大于0。但会引起一个ArrayIndexOutOfBoundexception的异常,因为整型数组c的长度是1,却给c42赋值。下面是以上两种情况的运行结果。a = 0div by 0: java.lang.ArithmeticException: / by zero6try语句的嵌套你可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部,写另一个try语句保护其他代码。每当遇到一个try语句,异常的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种异常进行处理,堆栈就会展开,直到遇到有处理这种异常的try语句。下面是一个try语句嵌套的例子。package com.chinasofti;class MultiNest static void procedure() try int c = 1 ;c42 = 99; catch (ArrayIndexOutOfBoundsException e) System.out.println(array index oob: + e);public static void main(String args) try int a = args.length;System.out.println(a = + a);int b = 42 / a;procedure(); catch (ArithmeticException e) System.out.println(div by 0: + e);成员函数procedure里有自己的try/catch控制,所以main不用去处理ArrayIndexOutOfBoundsException。7throw语句throw语句用来明确地抛出一个异常。首先,你必须得到一个Throwable的实例的控制柄,通过参数传到catch子句,或者用new操作符来创建一个。下面是throw语句的通常形式。throw ThrowableInstance;程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中从里向外寻找含有与其匹配的catch子句的try块。下面是一个含有throw语句的例子。package com.chinasofti;class ThrowDemo static void demoproc() try throw new NullPointerException(de3mo); catch (NullPointerException e) System.out.println(caught inside demoproc);throw e;public static void main(String args) try demoproc(); catch (NullPointerException e) System.out.println(recaught: + e);下面是这个例子的输出:caught inside demoprocrecaught: java.lang.NullPointerException: de3mo8 throws语句throws用来标明一个成员函数可能抛出的各种异常。对大多数Exception子类来说,Java编译器会强迫你声明在一个成员函数中抛出的异常的类型。如果异常的类型是Error或RuntimeException,或它们的子类,这个规则不起作用,因为这些在程序的正常部分中是不期待出现的。如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。这就重新定义了成员函数的定义语法:type method-name(arg-list) throws exception-list 下面是一段程序,它抛出了一个异常,但既没有捕捉它,也没有用throws来声明。这在编译时将不会通过。package com.chinasofti;class ThrowsDemo1 static void procedure() System.out.println(inside procedure);throw new IllegalAccessException(demo);public static void main(String args) procedure();为了让这个例子编译过去,我们需要声明成员函数procedure抛出了IllegalAccessException,并且在调用它的成员函数main里捕捉它。下面是正确的例子:package com.chinasofti;class ThrowsDemo static void procedure() throws IllegalAccessException System.out.println(inside procedure);throw new IllegalAccessException(demo);public static void main(String args) try procedure(); catch (IllegalAccessException e) System.out.println(caught + e);下面是这个例子的输出:inside procedurecaught java.lang.IllegalAccessException: demo9 finally当一个异常被抛出时,程序的执行就不再是线性的,跳过某?copy;行,甚至会由于没有与之匹配的catch子句而过早地返回。有时确保一段代码不管发生什么异常都被执行到是必要的,关键词finally就是用来标识这样一段代码的。即使你没有catch子句,finally程序块也会在执行try程序块后的程序之前执行。每个try语句都需要至少一个与之相配的catch子句或finally子句。一个成员函数返回到调用它的成员函数,或者通过一个没捕捉到的异常,或者通过一个明确的return语句,finally子句总是恰好在成员函数返回前执行。下面是一个例子,它有几个成员函数,每个成员函数用不同的途径退出,但执行了finally子句。package com.chinasofti;public class FinallyDemo static void procA() try System.out.println(inside procA);throw new RuntimeException(demo); finally System.out.println(procAs finally);static void procB() try System.out.println(inside procB);return; finally System.out.println(procBs finally);public static void main(String args) try procA(); catch (Exception e) e.printStackTrace();procB();下面是这个例子的输出:inside procAprocAs finallyinside procBjava.lang.R
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 灯光考试有哪几项题目及答案
- 田径晋级考试题目及答案
- 2025年公需科目考试试题库及答案
- 2025年公需科目诚信体系建设考试试题(含答案)
- 2025秋季开学第一课校长致辞:在金秋的起点上奔赴更“有品”的自己
- 2025年高危儿管理专科考核试题及答案
- 2025年高级美容师理论基础知识资格考试复习题库和答案
- 2025年高级会计师之高级会计实务通关考试题库带答案解析
- 计划与建设管理办法
- 论文警务化管理办法
- 2025年河北高考生物试题及答案
- ZDMS0.65S-A-YA型、ZDMS0.610S-A-YA型自动跟踪定位射流灭火系统现场控制箱使用说明书-佑安高科
- 无废校园知识培训课件
- 2025奇台县公安局招聘警务辅助人员(144人)考试参考题库附答案解析
- 中级政工考试题库及答案
- 《法律基础知识》教案
- 助老员督导培训课件
- 医疗公司加盟管理办法
- 2025年浙江省中考道德与法治试题答案详解讲评(课件)
- 广州南沙深化面向世界的粤港澳全面合作白皮书(2022.06-2025.06)
- 2025年电梯安全总监职责培训考核试题及答案
评论
0/150
提交评论