版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java程序设计,第六章异常处理与断言,本章教学目标,掌握Java中的异常处理机制 掌握断言的使用,本章内容,Java中的异常处理 断言,异常,异常情况的出现会改变正常的程序流程 很多情况可能导致异常,包括硬件故障、资源耗尽以及程序错误。 当Java中出现异常时,称为一个异常被“抛出”。负责处理异常的代码称作“异常处理程序”,它“捕获”抛出的异常 当某个异常发生时,需要有一种方法告诉JVM执行什么代码,为此,使用try和catch关键字,如以下形式try /被监视区域,存在可能产生异常的代码 catch(Exception e) /如果捕获到该类异常,执行这里,Java异常处理机制,把各种不同
2、类型的异常情况进行分类,用Java类来表示异常情况,这种类被称为异常类。把异常情况表示成异常类,可以充分发挥类的可扩展和可重用的优势。 异常流程的代码和正常流程的代码分离,提高了程序的可读性,简化了程序的结构。 可以灵活的处理异常,如果当前方法有能力处理异常,就捕获并处理它,否则只需抛出异常,由方法调用者来处理它。,public void work() try 工作8个小时 /可能会抛出DiseaseException异常 下班回家 catch(DiseaseException e) 去医院看病 ,异常处理,如果一个方法不想处理异常,可以通过throws 语句将异常抛向上级调用方法。 int
3、method1(int x)throws Exception1,Exception2 if(x0)throw new Exception1(); if(x=0)throw new Exception2(); return +x; void method2() throws Exception1,Exception2 /以下代码可能抛出异常 int a=method1(1); ,异常处理采用堆栈机制,public class ExTester static int method1(int x)throws Exception if(x0)throw new Exception(x0); retu
4、rn +x; static int method2(int x)throws Exception return method1(x); public static void main(String args)throws Exception System.out.println(method2(-1); ,main(),method2(),method1(),方法调用堆栈,finally语句,finally语句定义一个总是被执行的代码块,而不管有没有出现异常。,public void work() try 开门 工作8个小时 /可能会抛出DiseaseException异常 catch(Dis
5、easeException e) 去医院看病; finally 关门 ,public void work() try 开门 工作8个小时/可能会抛出DiseaseException异常 关门 catch(DiseaseException e) 去医院看病; ,finally语句,finally语句定义一个总是被执行的代码块,而不考虑是否出现异常。,public class FinallyTester static int method1(int x)throws Exception if(x0)throw new Exception(x0); return x+; public static
6、void main(String args) try System.out.println(method1(-1); System.out.println(end); catch(Exception e) System.out.println(Wrong); finally System.out.println(Finally); ,异常处理流程,try code1; /可能抛出各种异常 catch(SQLException e) System.out.println(SQLException); catch(IOException e) System.out.println(IOExcept
7、ion); catch(Exception e) System.out.println(Exception); ,异常处理流程,finally语句不被执行的唯一情况是程序先执行了终止程序的System.exit()方法 public static void main(String args) try System.out.println(Begin); System.exit(0); finally System.out.println(Finally); System.out.println(End); ,示例,打印 Begin Wrong Finally java.lang. Arithm
8、eticException,public class Sample public static void main(String args) throws Exception try System.out.println(Begin); new Sample().method1(0); / 出现ArithmeticException异常 System.exit(0); catch (Exception e) System.out.println(Wrong); throw e; / 如果把此行注释掉,将得到不同的运行结果 finally System.out.println(Finally);
9、 System.out.println(End); private void method1(int i) System.out.println(4 / i); ,异常处理流程,public static int methodA(int x) try if(x0) throw new Exception(x0); return x+; catch(Exception e) System.out.println(“Wrong); return -100; finally System.out.println(Finally); public static void main(String arg
10、s) System.out.println( methodA(-1)); ,打印 Wrong Finally -100,JDK类库中的异常分类,常见异常,ArithmeticException:数学异常 int a=12 / 0; /抛出ArithmeticException NullPointerException:空指针异常 Date d= null; System.out.println(d.toString(); /抛出NullPointerException ArrayIndexOutOfBoundsException:下标越界异常 int array=new int4; array
11、0=1; array7=1; /抛出ArrayIndexOutOfBoundsException ClassCastException:类型转换异常: Animal animal=new Dog(); Cat cat=(Animal)animal;,运行时异常,RuntimeException类及其子类都称为运行时异常,这种异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。例如当以下divide()方法的参数b为0,执行“a/b”操作时会出现ArrithmeticException
12、异常,它属于运行时异常,Java编译器不会检查它: public int divide(int a,int b) return a/b; /当参数b为0,抛出ArrithmeticException ,区分运行时异常和受检查异常,运行时异常表示无法让程序恢复运行的异常,导致这种异常的原因通常是由于执行了错误操作。一旦出现了错误操作,建议终止程序,因此Java编译器不检查这种异常。,public void method(int array) for(int i=0;i=array.length;i+) arrayi=1; /当i的取值为array.length时,将抛出ArrayIndexOut
13、OfBoundsException ,public void method(int array) for(int i=0;iarray.length;i+) arrayi=1; /不会抛出ArrayIndexOutOfBoundsException ,修改程序代码中的错误,区分运行时异常和受检查异常,受检查异常表示程序可以处理的异常,如果抛出异常的方法本身不能处理它,那么方法调用者应该去处理它,从而使程序恢复运行,不至于终止程序。 如果一个方法可能出现受检查异常,要么用try-catch语句捕获,要么用throws子句声明将它抛出,否则会导致编译错误。,void method1() throw
14、s IOException /合法 /编译错误,必须捕获或声明抛出IOException void method2() method1(); /合法,声明抛出IOException void method3()throws IOException method1(); ,/合法,声明抛出Exception void method4()throws Exception method1(); /合法,捕获IOException void method5() try method1(); catch(IOException e) ,用户定义异常,用户定义异常是通过扩展Exception类或Runti
15、meException来创建的。,class AnswerWrongException extends Exception private int result; public AnswerWrongException (int result) this.result=result; public int getResult() return result; ,用户定义异常,public class ExceptionTester public static void test(int x,int y,int z)throws AnswerWrongException if(x+y!=z) t
16、hrow new AnswerWrongException(z); System.out.println(x+y+=+z); public static void main(String args) try test(1,2,5); System.out.println(end); catch( AnswerWrongException e) System.out.println(result is wrong:+e.getResult(); e.printStackTrace(); ,获得异常信息,Exception提供了如下方法: toString() getMessage() print
17、StackTrace(),try test(1,2,5); System.out.println(end); catch( AnswerWrongException e) e.printStackTrace(); ,本章内容,Java中的异常处理 断言,断言(assert),从Java语言1.4版本加入了断言,它允许你在开发期间测试假设,而不必付出为异常编写异常处理程序方面的代码(时间和程序开销两方面),因为你假设一旦开发完成,并全部部署,这些异常将永远不会发生,断言概述,假设传递给方法(methodA)的数字不会为负数,当测试和调试时,想验证该假设,但又不想在开发完成时去除print语句、运
18、行时异常处理或if/else测试。 如果非常肯定自己的假设,不想花时间来编写异常处理代码,在运行时,也不想把if/else留在那里,可以在开发期间使用断言测试假设,当程序部署时,断言代码实质上会被清除,不会产生任何开销或要跟踪和删除的代码,private void methodA(int num) if(num=0) useNum(num + x); else System.out.println(“error: ”+num); ,使用断言,断言不仅使代码更简洁,而且除非它被特别打开(启用),否则断言是不活动的。 断言操作非常简单,总是断言某事是true,如果是true,则无问题,代码继续运行。但如果断言被证实是错的(false),则在这里抛出AssertionError(不应该处理它们),private void methodA(int num) assert(num=0); useNum(num + x) ,private void methodA(int num) useNum(num + x) ,断言的形式,断言有两种形式:简单和非常简单 非常简单:private void do
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026创新意义面试题及答案
- 义务教育学校规范办学行为自查报告范文
- 医院规章制度
- 学校实验教学安全管理制度
- 年产1200万米高端针织床垫面料生产线设备改造项目可行性研究报告模板申批拿地用
- 四川化学研究生就业方向
- 2026届高中地理一轮复习 内力作用与地表形态 课件
- 2026年品牌管理的试卷及答案
- 2026年一级建造师《水利水电》模拟习题及参考答案
- 2026年安徽省安庆市太湖县事业单位面试题附答案
- 九江市液化石油气公司九江经营分公司2026年面向社会公开招聘工作人员【13人】考试备考题库及答案详解
- 定点印刷服务采购项目方案投标文件(技术标)
- 急诊医学科常见急症快速识别与处理流程
- 儿童过敏性紫癜诊断与治疗指南(2026版)
- 公司安全风险管理情况汇报
- 校长专业水平测精彩试题
- 2026年河北考试物理试卷及答案
- 2026海南天然橡胶产业集团股份有限公司二级企业正副职储备人员招聘笔试参考题库及答案详解
- (正式版)T∕IAMAC 001-2025 保险资产管理行业数据分类分级指南
- 2026农作物植保员学习备考复习题库(新版)
- JJF 2241-2025 电子停车计时收费表校准规范
评论
0/150
提交评论