




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章异常处理机制,传统的处理方式,Java的异常处理机制,Java异常类,异常的处理,项目学做,课程内容,二,三,四,五,一,在进行程序设计时,错误的产生是不可避免的如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?这是任何程序设计语言都要解决的问题,一、传统处理方式,classCalculatestaticvoidcalculate(intnum1,intnum2)intnResult;nResult=num1+num2;/加法运算System.out.println(和=+nResult);nResult=num1-num2;/减法运算System.out.println(差=+nResult);nResult=num1*num2;/乘法运算System.out.println(积=+nResult);/除法运算,先判断分母为0不?注1if(num2!=0)nResult=num1/num2;System.out.println(商=+nResult);elseSystem.out.println(Error,没有商,除数为0!);,一、传统处理方式,if(num2!=0)nResult=num1%num2;System.out.println(余数=+nResultn第二次运算);elseSystem.out.println(Error,没有余数,除数为0!);publicclassTraditionalpublicstaticvoidmain(Stringaaa)intx=9,y=6;Calculate.calculate(x,y);/注3x=7;y=0;Calculate.calculate(x,y);/注4,一、传统处理方式,运行结果:和=15差=3积=54商=1余数=3第二次运算和=7积=0Error,没有商,除数为0!Error,没有余数除数为0!,程序可读性差,大量的错误处理代码混杂在程序中观察前面的程序,会发现大部分精力花在出错处理上只把能够想到的错误考虑到,此外的情况无法处理出错返回信息量太少,无法更确切的了解错误状况或原因,以常规方法处理错误存在的问题,一、传统处理方式,所谓错误,是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的强壮性(robust),程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。,二、Java异常处理机制,Java异常是Java提供的用于处理程序中错误的一种机制。所谓错误是指在程序运行过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在)。设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。,二、Java异常处理机制,Java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给Java运行时系统,这个过程称为抛出(throw)异常。当Java运行时系统接收到异常对象时,会寻找处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。,二、Java异常处理机制,三、Java异常类,J2SDK定义了很多异常类,这些类对应了各种各样可能出现的异常事件。,Error:称为错误,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。(也处理不了)Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显式的声明或捕获。RuntimeException:一类特殊的异常,如被0除、数据下标越界等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。,三、Java异常类,所有的包中都定义了异常类和错误类。Exception类是所有异常的父类Error类是所有错误的父类,这两个类都实现了Throwable接口。,三、Java异常类,NCEPU,3异常分类,Throwable,NCEPU,3异常分类,Throwable,NCEPU,3异常分类,Throwable,catch(ArrayIndexOutOfBoundsExceptione),catch(IndexOutOfBoundsExceptione),catch(RuntimeExceptione),catch(Exceptione),catch(Throwablee),算术异常ArithmeticException整数除法中,若除数为0,或用0取模,会发生该异常。例如:inti=12/0;intm=5%0;其他算术操作不会产生异常,几个常见的公用异常类,三、Java异常类,空指针异常NullPointerException当程序试图访问一个空对象(即没有实例化的对象)中的变量或方法,或一个空数组中的元素时,会发生该异常。例如:inta=null;a0=0;Strings=null;System.out.println(s.length();,几个常见的公用异常类,三、Java异常类,类型强制转换异常ClassCastException当进行类型强制转换时,对于不能进行的转换操作,会发生该异常。例如:Objectobj=newObject();Strings=(String)obj;,几个常见的公用异常类,三、Java异常类,数组负下标异常NagativeArraySizeException创建数组时,若数组元素个数为负,会发生该异常。例如:inta=newint-3;,几个常见的公用异常类,三、Java异常类,数组下标越界异常ArrayIndexOutOfBoundsException试图访问一个越界的数组元素时(即下标大于等于数组的成员变量length),会发生该异常。例如:inta=newint1;a1=3;,几个常见的公用异常类,三、Java异常类,ArithmeticExceptionNullPointerExceptionClassCastExceptionNagativeArraySizeExceptionArrayIndexOutOfBoundsException都是运行时异常类(RuntimeException)的子类,几个常见的公用异常类,三、Java异常类,常见的异常类型,Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throws,捕获异常,catch,try,finally,执行可能产生异常的代码,捕获异常,无论是否发生异常,代码总能执行,手动抛出异常,抛出异常,throw,声明异常,声明方法可能要抛出的各种异常,throws,四、异常处理,try,catch,try-catch块后的代码段,publicvoidmethod()try/代码段(此处不会产生异常)catch(异常类型ex)/对异常进行处理的代码段/代码段,使用try-catch块捕获异常,分为三种情况:,第一种情况,四、异常处理,publicclassTest3publicstaticvoidmain(Stringargs)tryScannerin=newScanner(System.in);System.out.print(请输入被除数:);intnum1=in.nextInt();System.out.print(请输入除数:);intnum2=in.nextInt();System.out.println(String.format(%d/%d=%d,num1,num2,num1/num2);System.out.println(感谢使用本程序!);catch(Exceptione)System.err.println(出现错误:被除数和除数必须是整数,+除数不能为零。);e.printStackTrace();,try-catch块,使用示例模拟第一种情况:,输入:200,40,四、异常处理,try,catch,异常类型匹配,try-catch块后的代码段,进入catch块,publicvoidmethod()try/代码段1/产生异常的代码段2/代码段3catch(异常类型ex)/对异常进行处理的代码段4/代码段5,使用try-catch块捕获异常,分为三种情况:,第二种情况,产生异常对象,程序继续执行,异常是一种特殊的对象,类型为java.lang.Exception或其子类,发生异常,try-catch块,四、异常处理,publicclassTest3publicstaticvoidmain(Stringargs)tryScannerin=newScanner(System.in);System.out.print(请输入被除数:);intnum1=in.nextInt();System.out.print(请输入除数:);intnum2=in.nextInt();System.out.println(String.format(%d/%d=%d,num1,num2,num1/num2);System.out.println(感谢使用本程序!);catch(Exceptione)System.err.println(出现错误:被除数和除数必须是整数,+除数不能为零。);e.printStackTrace();,try-catch块,使用示例模拟第二种情况:,输入:B,输入:200,0,四、异常处理,printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程,java.util.InputMismatchExceptionatjava.util.Scanner.throwFor(Scanner.java:840)atjava.util.Scanner.next(Scanner.java:1461)atjava.util.Scanner.nextInt(Scanner.java:2091)atjava.util.Scanner.nextInt(Scanner.java:2050)atcn.jbit.exception.Test3.main(Test3.java:15),异常类型,异常堆栈信息,在此方法中抛出了异常,try-catch块,出现异常的位置,四、异常处理,try,catch,异常类型不匹配,try-catch块后的代码段,程序中断运行,发生异常,publicvoidmethod()try/代码段1/产生异常的代码段2/代码段3catch(异常类型ex)/对异常进行处理的代码段4/代码段5,使用try-catch块捕获异常,分为三种情况:,第三种情况,产生异常对象,try-catch块,四、异常处理,try-catch块,在catch块中处理异常加入用户自定义处理信息调用异常对象的方法输出异常信息,e.printStackTrace();,System.err.println(出现错误:被除数和除数必须是整数,+除数不能为零。);,四、异常处理,在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行,try块,finally块,catch块,无异常,有异常,try-catch-finally,四、异常处理,publicclassTest4publicstaticvoidmain(Stringargs)tryScannerin=newScanner(System.in);System.out.print(请输入被除数:);intnum1=in.nextInt();System.out.print(请输入除数:);intnum2=in.nextInt();System.out.println(String.format(%d/%d=%d,num1,num2,num1/num2);catch(Exceptione)System.err.println(“出现错误:被除数和除数必须是整数,+除数不能为零。);System.out.println(e.getMessage();finallySystem.out.println(感谢使用本程序!);,try-catch-finally,输入:20040,输入:2000,第一种情况:无异常,第二种情况:有异常,四、异常处理,finally块中语句不执行的唯一情况异常处理代码中执行System.exit(1)退出Java虚拟机,try-catch-finally,publicclassTest5publicstaticvoidmain(Stringargs)tryScannerin=newScanner(System.in);System.out.print(请输入被除数:);intnum1=in.nextInt();System.out.print(请输入除数:);intnum2=in.nextInt();System.out.println(String.format(%d/%d=%d,num1,num2,num1/num2);catch(Exceptione)System.err.println(出现错误:被除数和除数必须是整数,+除数不能为零);System.exit(1);/finally语句块不执行的唯一情况finallySystem.out.println(感谢使用本程序!);,四、异常处理,publicvoidmethod()try/代码段/产生异常(异常类型2)catch(异常类型1ex)/对异常进行处理的代码段catch(异常类型2ex)/对异常进行处理的代码段catch(异常类型3ex)/对异常进行处理的代码段/代码段,一段代码可能会引发多种类型的异常当引发异常时,会按顺序来查看每个catch语句,并执行第一个与异常类型匹配的catch语句执行其中一条catch语句后,其后catch语句将被忽略,try,与异常类型1不匹配,try-catch块后的代码段,发生异常,产生异常对象,catch,与异常类型2匹配,catch,catch,程序继续执行,进入catch块,多重catch块,四、异常处理,多重catch块2-2,publicclassTest6publicstaticvoidmain(Stringargs)tryScannerin=newScanner(System.in);System.out.print(请输入被除数:);intnum1=in.nextInt();System.out.print(请输入除数:);intnum2=in.nextInt();System.out.println(String.format(%d/%d=%d,num1,num2,num1/num2);catch(InputMismatchExceptione)System.err.println(被除数和除数必须是整数。);catch(ArithmeticExceptione)System.err.println(除数不能为零。);catch(Exceptione)System.err.println(其他未知异常。);,输入:B,进入第一个catch块,输入:2000,进入第二个catch块,在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,即先子类后父类,练习根据编号输出课程名称,需求说明:按照控制台提示输入13之间任一个数字,程序将输出相应的课程名称根据键盘输入进行判断。如果输入正确,输出对应课程名称。如果输入错误,给出错误提示不管输入是否正确,均输出“欢迎提出建议”语句,完成时间:20分钟,共性问题集中讲解,常见调试问题及解决办法代码规范问题,共性问题集中讲解,声明异常,Java语言中通过throws声明某个方法可能抛出的各种异常可以同时声明多个异常,之间由逗号隔开,publicclassTest7publicstaticvoiddivide()throwsExceptionScannerin=newScanner(System.in);System.out.print(请输入被除数:);intnum1=in.nextInt();System.out.print(请输入除数:);intnum2=in.nextInt();System.out.println(String.format(%d/%d=%d,num1,num2,num1/num2);publicstaticvoidmain(Stringargs)trydivide();catch(Exceptione)e.printStackTrace();/publicstaticvoidmain(Stringargs)throwsException/divide();/,divide()方法没有处理异常,而是声明异常,方式1:调用者通过try-catch捕获并处理异常,方式2:调用者通过throws继续声明异常,四、异常处理,除了系统自动抛出异常外,有些问题需要程序员自行抛出异常,publicclassPersonprivateStringname=;/姓名privateintage=0;/年龄privateStringsex=男;/性别publicvoidsetSex(Stringsex)throwsExceptionif(男.equals(sex)|女.equals(sex)this.sex=sex;elsethrownewException(性别必须是“男”或者“女”!);publicvoidprint()System.out.println(+(+this.sex+,+this.age+岁));,publicclassTest8publicstaticvoidmain(Stringargs)Personperson=newPerson();tryperson.setSex(Male);person.print();catch(Exceptione)e.printStackTrace();,抛出异常,捕获异常,或者throws异常,抛出异常,四、异常处理,五、项目学做,1.项目目标(1)了解Throwable类及其子类;(2)了解运行时异常;(3)掌握如何捕获异常、声明异常和抛出异常;(4)掌握如何自定义异常;(5)正确使用异常处理机制;2.项目任务虚拟银行取钱过程,如果取钱数大于余额时需要做异常处理。假如取钱2000,余额为1500元,就会出现预计好的异常处理消息。,(1)银行类classBankdoublebalance;/存款数Bank(doublebalance)this.balance=balance;publicvoiddeposite(doubledAmount)if(dAmount0.0)balance+=dAmount;publicvoidwithdrawal(doubledAmount)throwsInsufficientFundsExceptionif(balancedAmount)thrownewInsufficientFundsException(this,dAmount);balance=balance-dAmount;publicvoidshowBalance()System.out.println(Thebalanceis+(int)balance);,五、项目学做,(2)自定义异常类publicclassInsufficientFundsExceptionextendsExceptionprivateBankexcepbank;/银行对象privatedoubleexcepAmount;/要取的钱InsufficientFundsException(Bankba,doubledAmount)excepbank=ba;excepAmount=dAmount;publicStringexcepMessage()Stringstr=Thebalanceis+excepbank.balance+n+Thewithdrawalwas+excepAmount;returnstr;/异常类,五、项目学做,(3)前端调用类publicclassExceptionDemopublicstaticvoidmain(Stringargs)tryBankba=newBank(1500);ba.withdrawal(2000);System.out.println(Withdrawalsuccessful!);catch(InsufficientFundsExceptione)System.out.println(e.toString();System.out.println(e.excepMessage();,五、项目学做,异常处理的一般格式:Java的异常处理机制使得处理异常的代码和“常规”代码分开,减少
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智慧社区:两人合伙智慧社区建设合作协议
- 商铺租赁合同中租赁物损坏赔偿及修复合同
- 借读生校园社会实践协议及实践成果转化合同
- 2025公务员求职面试题目及答案
- 激光冲击成形技术-洞察及研究
- 主管专业知识试题及答案
- 基于离线的智能配电网控制-洞察及研究
- 军史知识竞赛题及答案2025年
- 神经炎症基因调控-洞察及研究
- ICU脑梗死的护理查房
- T-YNX 002-2025 葡萄组培脱毒快繁技术规程
- 衣服投标供货方案(3篇)
- 2025至2030年中国丁酮肟市场现状分析及前景预测报告
- 公司电脑补贴管理办法
- 中石化对供应商管理办法
- Unit 2 Home Sweet Home 语法与阅读专项练习 (含答案) 人教版(2024)八年级上册
- 2025年少先队应知应会知识竞赛考试题库及答案
- 【课件】第14章+全等三角形+数学活动++式+课件2025-2026学年人教版数学八年级上册
- 2025版安全生产法全文
- 高中英语高考词汇200句-教师版(简单句80)二
- 《山居秋暝》(王维)测试题带答案
评论
0/150
提交评论