




已阅读5页,还剩59页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五讲 错误及异常处理 Error Handling with Exceptions * * 1 1 学习要点 异常的基础知识 异常的处理 自定义的异常 DateDate 2 2 Java对异常的处理 在程序运行中出现的某种可预期的、阻止程 序正常运行的情况称为异常 Java中通过面向对象的方式来处理异常 如果某方法在执行过程中产生异常,则该方法将 产生代表该异常的对象,并将其传递给运行时系 统,这个过程称为抛出(throw)异常 运行时系统寻找出相应的代码来处理这一异常, 这一过程称为捕获(catch)异常。 DateDate 3 3 在方法中处理异常的方式 捕获(catch)异常 一个方法可以在方法内部提供处理异常的代码 来捕获(catch)异常 声明(Specify )异常 如果一个方法内部不对异常进行捕获时,必须 对异常进行声明,表示当前的方法将产生某种 异常。 此时方法抛出的异常将由调用它的方法来处理 DateDate 4 4 异常的分类 Checked Exceptions(校验异常):在编译过 程中被检测的异常。 校验异常必须被捕获或声明。 Runtime Exceptions(运行时异常):在运行 过程中被检测的异常。 运行时异常可以不进行捕获和声明。 DateDate 5 5 对异常进行捕获 对异常的捕获由三个部分组成 try语句 catch语句 finally语句 DateDate 6 6 try语句 try语句的语法为: try Java statements Java statements:指一段可能产生一个或多个 例外的代码 DateDate 7 7 catch语句 catch语句的语法为 catch (SomeThrowableObject variableName) Java statements SomeThrowableObject :声明了异常处理的类型 ,它必须是Throwable类的子类。 variableName:运行时在try代码块中抛出的异常 对象。 Java statements:指一段用来处理异常的代码。 DateDate 8 8 finally语句 finally语句的语法 finally Java statements finally语句为Java程序提供了统一的出口 在try语句限定的代码中,如果某段代码抛出了异 常,其后的代码将不再被执行。 无论try所指定的代码是否抛出异常,finally所指 定的代码都将被执行。 DateDate 9 9 捕获异常的注意事项 catch语句和finally语句必须和try配对出现 try语句之后必须存在catch语句或者finally 语句或者两者同时存在。 try语句不可以脱离catch语句和finally语句 而独立存在。 DateDate1010 catch语句不可省略的情况 当try语句包含的代码块中抛出了checked Exception时,catch语句不可省略 此时finally语句可以被省略 DateDate1111 捕获异常时的注意事项 try语句和catch语句必须成对出现 finally语句可以被省略 捕获例外的完整语法为 或者 try . . . catch ( . . . ) . . . catch ( . . . ) . . . try . . . catch ( . . . ) . . . catch ( . . . ) . . . finally. . . DateDate1212 可以省略catch语句的情况 当try语句中的代码没有抛出任何必须捕获 的异常时,catch语句可以被省略。但是至 少必须存在catch语句和finally语句中的一个 语句。 这种方法是很有必要的: 代码中有可能抛出运行时异常。 当前的写法主要为运行时异常提供统一的出口 。 DateDate1313 举例 public class TestA public static void methodA() try System.out.println(“abcd“); finally System.out.println(“123456“); public static void main(String args) methodA(); DateDate1414 示例说明 上例中用红色标出的部分没有抛出任何必 须捕获的例外,此时省略了catch语句。在 编译和运行时都没有产生任何信息 上例的运行结果如下: abcd 123456 DateDate1515 捕获异常举例 import java.io.*; public class CatchException public static void main(String args) try FileInputStream in = new FileInputStream(“test.txt“); System.out.println(“in proc try”); catch(FileNotFoundException e) System.out.println(“in proc catch); finally System.out.println(“in proc finally“); DateDate1616 运行结果 如果存在文件test.txt时将输出: in proc try in proc finally 如果文件test.txt文件不存在时将输出: in proc catch in proc finally DateDate1717 示例说明 类FileInputStream在指定文件不存在时将抛 出FileNotFoundException,此时将不执行 System.out.println(“in proc try”)语句 无论是否抛出例外,finally语句所包含的代码 块:System.out.println(“in proc finally”)都将 被执行 DateDate1818 finally语句的执行举例(1) try File f = new File(“test.txt”); FileInputStream in = new FileInputStream(f); System.out.println(“in proc try”); catch(FileNotFoundException e) return ; finally System.out.println(“in proc finally”); DateDate1919 示例说明 上例中如果抛出例外,则在catch语句中将 执行return语句表示调用结束,但是此时的 结果为: in proc finally return语句被执行前,Java运行时环境先执行 finally语句。 DateDate2020 finally语句的执行举例(2) try File f = new File(“test.txt”); FileInputStream in = new FileInputStream(f); System.out.println(“in proc try”); return ; catch(FileNotFoundException e) System.out.println(“in proc catch”); finally System.out.println(“in proc finally”); DateDate2121 示例说明 上例如果没有抛出FileNotFoundException 时,将执行打印语句,和return语句,此时 的运行结果为: in proc try in proc finally 在return语句执行前,Java运行时环境先执行 了finally语句 DateDate2222 finally语句小结 finally语句“总是”被执行 不执行finally语句的唯一情况是Java虚拟机 关闭(如使用System.exit()或者是机器关闭 )。 DateDate2323 捕获异常的规则 在捕获异常时,catch语句可能存在多个,此 时Java运行时系统将按照catch语句的顺序 依次进行匹配直到找到匹配的catch语句为 止。 匹配的catch语句表示 catch语句中处理的例外类型和生成的例外对象 类型完全一致 catch语句中处理的例外类型为生成的例外对象 类型的父类 DateDate2424 举例 try File f = new File(“test.txt”); FileInputStream in = new FileInputStream(f); int r = in.read(); in.close(); catch(IOException e) catch(FileNotFoundException e) DateDate2525 示例说明 在创建FileInputStream时,Java运行时系统将抛出 FileNotFoundException 在执行FileInputStream中的read()方法时,Java运 行时系统将抛出IOException FileNotFoundException为IOException的子类 系统如果抛出FileNotFoundException时,Java运行 时系统首先和第一个catch语句相匹配, IOException能够与FileNotFoundException匹配, Java运行时系统将不再和之后的catch语句进行匹配 此时第二个catch语句将不再执行。 DateDate2626 捕获异常的规则(2) 在使用catch语句时,仅仅能够捕获try语句 中的代码抛出的异常类型本身或者异常类 型的父类 如果catch语句中捕获了try语句中的代码不 可能抛出的例外时,代码将不能编译通过 如果catch语句中使用如下方式: catch(Exception e) 在任何情况下编译都能够通过 DateDate2727 举例 public class CatchTest static public void methodA() try System.out.println(“abcd“); catch(FileNotFoundException e) public static void main(String args) methodA(); DateDate2828 示例说明 上例编译不能通过 编译的错误信息如下: CatchTest.java:10: exception java.io.FileNotFoundException is never thrown in body of corresponding try statement catch(FileNotFoundException e) 如果将FileNotFoundException替换为 Exception编译将可以通过。 DateDate2929 异常的声明 声明异常使用throws字句进行 声明异常的语法如下 ReturnType methodName(paramList) throws ExceptionList ExceptionList为用逗号隔开的异常类型。 DateDate3030 声明异常举例 import java.io.*; public class CatchException void ThrowException() throws FileNotFoundException File f = new File(“test.txt”); FileInputStream in = new FileInputStream(f); System.out.println(“in proc”); DateDate3131 异常的抛出(throw) 在捕获异常之前必须有一段代码生成了一 个异常对象,并把它抛出 任何Java代码都可以抛出异常 可以从用户编写的代码中抛出 可以从JDK的类中抛出 可以从Java运行时系统中抛出 DateDate3232 抛出异常的语法 抛出异常使用的关键字为throw,它的语法 格式为 throw someThrowableObject; someThrowableObject:一个可被抛出的对象 someThrowableObject必须是Throwable类的子 类。 如果某方法内部抛出了异常对象,此异常 对象必须被声明 DateDate3333 从方法中抛出异常举例 public Object pop() throws EmptyStackException Object obj; if (size = 0) throw new EmptyStackException(); obj = objectAt(size - 1); setObjectAt(size - 1, null); size-; return obj; 抛出的对象必须是 Throwable类的子类 方法中有例外抛出时 必须在方法中声明 DateDate3434 抛出异常的注意事项 紧跟throw语句之后不能再有任何语句,否 则在编译时不能通过 当throw语句被执行后将执行捕获语句,因此 throw语句之后的任何语句将没有任何执行的 可能。 DateDate3535 举例 public Object pop() throws EmptyStackException Object obj; if (size = 0) throw new EmptyStackException(); System.out.println(“after proc throw”); obj = objectAt(size - 1); setObjectAt(size - 1, null); size-; return obj; DateDate3636 示例说明 上例是某类中的一个方法片断。 上例在编译时将不能通过 编译时的错误信息为: TestA.java:6: unreachable statement System.out.println(“after proc throw”); 1 error DateDate3737 异常的传递 如果一个方法内的语句抛出了异常,通常 该异常会被抛到调用此方法的方法中。 如果某异常没有在调用方法中处理,它会 继续抛给这个调用方法的调用者 这个过程将一直持续到此异常被捕获 如果异常被抛到main()方法中,而main()方 法也未曾对异常处理,则程序将非法终止 DateDate3838 Throwable类及子类的层次结构 DateDate3939 Java中任何可抛出的对象都是Throwabled的 子类 Throwable有两个直接子类 Error Exception Throwable DateDate4040 Error 运行中遇到不可能或难以恢复的问题时, 系统将抛出Error。 Java代码中不对Error进行处理 DateDate4141 Exception是异常的基本类 在用户编写的程序中抛出或捕获的对象全部 都是Exception的直接或间接的子类 Exception DateDate4242 Exception的类别 RuntimeException类是运行时异常的基本类 RuntimeException类的所有子类都属于运行 时异常 运行时异常以外的其它所有的Exception类 的子类都为Checked Exceptions DateDate4343 常见的运行时异常 ArithmeticException ClassCastException NullPointerException NegativeArraySizeException NumberFormatException ArrayIndexOutOfBoundsException SecurityException DateDate4444 ArithmeticExcepion 试图进行整数被零除运算时,Java运行时 环境将抛出ArithmeticException 例: int i= 12/0; 当进行double类型、float类型数据被零除运算 时,Java运行时环境不会抛出例外 DateDate4545 ClassCastException 试图将某对象强制转换成为其子类或者其 他类的实例时,Java运行时环境将抛出 ClassCastException 例: Collection c = new List(); Vector v = (Vector)c; DateDate4646 NullPointerException 试图访问一个没有被实例化的对象的成员 变量或方法时,Java运行时环境将抛出 NullPointerException 例: Date d = null; System.out.println(d.toString(); DateDate4747 NegativeArraySizeException 试图使用负数作为维数创建一个数组时, Java运行时系统将抛出 NegativeArraySizeException 例: int num = -3; String strs = new Stringnum; DateDate4848 ArrayIndexOutOfBondsExceptio n 试图访问的数组元素超过了数组大小时, Java运行时环境将抛出 ArrayIndexOutOfBondsException 例: String strs=new String4; System.out.println(strs4); DateDate4949 NumberFormatException 试图将一个不表示数字的字符串转换成数 字时,Java运行时环境将抛出 NumberFormatException 例: Integer.parseInt(“test”); DateDate5050 SecurityException SecurityException通常在浏览器内抛出,任 何试图进行以下操作(除非被允许),都 会抛出SecurityException 访问本地文件 访问一个不是为Applet服务的主机 在运行时环境中执行另一个程序 DateDate5151 方法重载与异常 如果父类方法中抛出了某种例外,子类重 载该方法时,只能抛出父类方法中的异常 或异常的子类 DateDate5252 方法重载与异常举例 public class TestA public void methodA throws IOException public class TestB extends TestA public void methodA throws Exception DateDate5353 示例说明 上例中类TestB编译不能通过 编译错误信息如下: TestB.java:3: methodA() in TestB cannot override methodA() in TestA; overridden method does not throw java.lang.Exception public void methodA() throws Exception 1 error DateDate5454 自定义异常 通过扩展Exception类可以创建用户定义的 异常。 DateDate5555 public class NumberException extends Exception String info; public NumberException () info = “it is a wrong number”; public NumberException(int number) info=“Number ”+number+“ is not permitted”; public String toString() return ; 自定义异常举例 自定义的异常是 Exception类的子类 DateDate5656 public class ExceptionDemo static void check(int i, int balance) throws NumberException if(i balance) throw new NumberException(); else if(i=0) throw new NumberException(i); else System.out.println(“exit without exception”); DateDate5757 public static void main(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年应急管理部所属单位第二批次招聘185人考前自测高频考点模拟试题及答案详解(新)
- 2025年福州左海置地有限公司副总经理职业经理人市场化选聘模拟试卷有答案详解
- 2025安徽工程大学硕士专职辅导员招聘8人考前自测高频考点模拟试题及完整答案详解
- 2025甘肃甘南玛曲县警务辅助人员招聘20人模拟试卷及答案详解(名校卷)
- 浙江国企招聘2025年台州市住房公积金管理中心临海分中心下属国有企业公开招聘工作人员笔试历年参考题库附带答案详解
- 2025湖南邵阳市中心医院住院医师规范化培训招录65人模拟试卷附答案详解(黄金题型)
- 2025重庆艺术大市场有限公司招聘1人笔试历年参考题库附带答案详解
- 2025贵州民族大学高层次人才引进考前自测高频考点模拟试题附答案详解(考试直接用)
- 2025贵州盐业(集团)遵义有限责任公司招聘15人笔试历年参考题库附带答案详解
- 2025福建福州福清市土投土地开发有限公司招聘劳务派遣1人笔试历年参考题库附带答案详解
- 2025年“学宪法、讲宪法”主题活动知识竞赛题库及答案
- 2024年毕节威宁自治县招聘城市社区工作者真题
- 医院感染管理办法
- 智慧校园XXX学院总体解决方案
- 2025年电子专用设备制造行业研究报告及未来行业发展趋势预测
- BIM 建模基础与应用教学教案
- 2025至2030年中国工艺美术品行业市场前景预测及投资战略研究报告
- 国庆中秋课件
- 滚筒干燥机设计毕业设计
- 真空包装机作业指导书
- 2023年上海16区高考一模英语听力合集附音频含答案含原文
评论
0/150
提交评论