异常处理机制_第1页
异常处理机制_第2页
异常处理机制_第3页
异常处理机制_第4页
异常处理机制_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

异常处理机制第一页,共四十八页,编辑于2023年,星期二传统的处理方式Java的异常处理机制Java异常类异常的处理项目学做课程内容二三四五一第二页,共四十八页,编辑于2023年,星期二在进行程序设计时,错误的产生是不可避免的如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?这是任何程序设计语言都要解决的问题一、传统处理方式第三页,共四十八页,编辑于2023年,星期二classCalculate{ staticvoidcalculate(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不?

注1 if(num2!=0){ nResult=num1/num2; System.out.println("商="+nResult); } else{ System.out.println("Error,没有商,除数为0!"); }

一、传统处理方式第四页,共四十八页,编辑于2023年,星期二if(num2!=0){ nResult=num1%num2;System.out.println("余数="+nResult"\n第二次运算");}else{ System.out.println("Error,没有余数,除数为0!");}}}publicclassTraditional{ publicstaticvoidmain(String[]aaa){ intx=9,y=6; Calculate.calculate(x,y);////注3 x=7; y=0; Calculate.calculate(x,y);////注4 }}一、传统处理方式运行结果:和=15差=3积=54商=1余数=3第二次运算和=7积=0Error,没有商,除数为0!Error,没有余数除数为0!第五页,共四十八页,编辑于2023年,星期二程序可读性差,大量的错误处理代码混杂在程序中观察前面的程序,会发现大部分精力花在出错处理上只把能够想到的错误考虑到,此外的情况无法处理出错返回信息量太少,无法更确切的了解错误状况或原因以常规方法处理错误存在的问题一、传统处理方式第六页,共四十八页,编辑于2023年,星期二所谓错误,是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的强壮性(robust),程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。二、Java异常处理机制第七页,共四十八页,编辑于2023年,星期二Java异常是Java提供的用于处理程序中错误的一种机制。所谓错误是指在程序运行过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在)。设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。二、Java异常处理机制第八页,共四十八页,编辑于2023年,星期二Java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给Java运行时系统,这个过程称为抛出(throw)异常。当Java运行时系统接收到异常对象时,会寻找处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。二、Java异常处理机制第九页,共四十八页,编辑于2023年,星期二三、Java异常类J2SDK定义了很多异常类,这些类对应了各种各样可能出现的异常事件。ThrowableEorrorExceptionRuntimeException第十页,共四十八页,编辑于2023年,星期二Error:称为错误,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。(也处理不了)Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显式的声明或捕获。RuntimeException:一类特殊的异常,如被0除、数据下标越界等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。三、Java异常类第十一页,共四十八页,编辑于2023年,星期二所有的包中都定义了异常类和错误类。Exception类是所有异常的父类Error类是所有错误的父类,这两个类都实现了Throwable接口。三、Java异常类第十二页,共四十八页,编辑于2023年,星期二NCEPU3

异常分类

ThrowableErrorException虚拟机错误……内存溢出错误图形界面错误内存溢出错误栈溢出错误类定义未找到错误第十三页,共四十八页,编辑于2023年,星期二NCEPU3

异常分类

ThrowableErrorExceptionRuntimeException运行时异常……文件已结束异常文件未找到异常方法未找到异常输入输出异常图形界面异常第十四页,共四十八页,编辑于2023年,星期二NCEPU3

异常分类

ThrowableErrorExceptionRuntimeException运行时异常……算术异常类型强制转换异常方法未找到异常输入输出异常图形界面异常空指针异常数组负下标异常违背安全原则异常数组下标越界异常下标越界异常IndexOutOfBoundsExceptioncatch(ArrayIndexOutOfBoundsExceptione)catch(IndexOutOfBoundsExceptione)catch(RuntimeExceptione)catch(Exceptione)catch(Throwablee)第十五页,共四十八页,编辑于2023年,星期二算术异常ArithmeticException

整数除法中,若除数为0,或用0取模,会发生该异常。

例如:

inti=12/0;

intm=5%0;

其他算术操作不会产生异常

几个常见的公用异常类三、Java异常类第十六页,共四十八页,编辑于2023年,星期二空指针异常NullPointerException

当程序试图访问一个空对象(即没有实例化的对象)中的变量或方法,或一个空数组中的元素时,会发生该异常。

例如:

inta[]=null;a[0]=0;

Strings=null;System.out.println(s.length());几个常见的公用异常类三、Java异常类第十七页,共四十八页,编辑于2023年,星期二类型强制转换异常ClassCastException

当进行类型强制转换时,对于不能进行的转换操作,会发生该异常。

例如:

Objectobj=newObject();

Strings=(String)obj;几个常见的公用异常类三、Java异常类第十八页,共四十八页,编辑于2023年,星期二数组负下标异常NagativeArraySizeException

创建数组时,若数组元素个数为负,会发生该异常。

例如:

inta[]=newint[-3];几个常见的公用异常类三、Java异常类第十九页,共四十八页,编辑于2023年,星期二数组下标越界异常ArrayIndexOutOfBoundsException

试图访问一个越界的数组元素时(即下标大于等于数组的成员变量length),会发生该异常。

例如:

inta[]=newint[1];

a[1]=3;几个常见的公用异常类三、Java异常类第二十页,共四十八页,编辑于2023年,星期二ArithmeticExceptionNullPointerExceptionClassCastExceptionNagativeArraySizeExceptionArrayIndexOutOfBoundsException都是运行时异常类(RuntimeException)的子类几个常见的公用异常类三、Java异常类第二十一页,共四十八页,编辑于2023年,星期二常见的异常类型方法名说明Exception异常层次结构的根类ArithmeticException算术错误情形,如以零作除数ArrayIndexOutOfBoundsException数组下标越界NullPointerException尝试访问null对象成员ClassNotFoundException不能加载所需的类InputMismatchException欲得到数据类型与实际输入类型不匹配IllegalArgumentException方法接收到非法参数ClassCastException对象强制类型转换出错NumberFormatException数字格式转换异常,如把"abc"转换成数字第二十二页,共四十八页,编辑于2023年,星期二Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throws

捕获异常catchtryfinally执行可能产生异常的代码捕获异常无论是否发生异常,代码总能执行手动抛出异常抛出异常throw声明异常声明方法可能要抛出的各种异常throws四、异常处理第二十三页,共四十八页,编辑于2023年,星期二trycatchtry-catch块后的代码段publicvoidmethod(){try{//代码段(此处不会产生异常)}catch(异常类型ex){//对异常进行处理的代码段}//代码段}使用try-catch块捕获异常,分为三种情况:第一种情况四、异常处理第二十四页,共四十八页,编辑于2023年,星期二publicclassTest3{ publicstaticvoidmain(String[]args){

try{ Scannerin=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处理异常四、异常处理第二十五页,共四十八页,编辑于2023年,星期二trycatch异常类型匹配try-catch块后的代码段进入catch块publicvoidmethod(){try{//代码段1//产生异常的代码段2//代码段3}catch(异常类型ex){//对异常进行处理的代码段4}//代码段5}使用try-catch块捕获异常,分为三种情况:第二种情况产生异常对象程序继续执行异常是一种特殊的对象,类型为java.lang.Exception或其子类

发生异常try-catch块四、异常处理第二十六页,共四十八页,编辑于2023年,星期二publicclassTest3{ publicstaticvoidmain(String[]args){

try{ Scannerin=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演示示例:使用try-catch处理异常四、异常处理第二十七页,共四十八页,编辑于2023年,星期二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块出现异常的位置四、异常处理第二十八页,共四十八页,编辑于2023年,星期二trycatch异常类型不匹配try-catch块后的代码段程序中断运行

发生异常publicvoidmethod(){try{//代码段1//产生异常的代码段2//代码段3}catch(异常类型ex){//对异常进行处理的代码段4}//代码段5}使用try-catch块捕获异常,分为三种情况:第三种情况产生异常对象try-catch块四、异常处理第二十九页,共四十八页,编辑于2023年,星期二try-catch块在catch块中处理异常加入用户自定义处理信息调用异常对象的方法输出异常信息e.printStackTrace();System.err.println("出现错误:被除数和除数必须是整数, "+ "除数不能为零。");方法名说明voidprintStackTrace()输出异常的堆栈信息StringgetMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分四、异常处理第三十页,共四十八页,编辑于2023年,星期二在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行try块finally块catch块无异常有异常try-catch-finally四、异常处理第三十一页,共四十八页,编辑于2023年,星期二publicclassTest4{ publicstaticvoidmain(String[]args){ try{ Scannerin=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()); }finally{ System.out.println("感谢使用本程序!"); } }}try-catch-finally输入:20040输入:2000第一种情况:无异常第二种情况:有异常演示示例:使用try-catch-finally处理异常四、异常处理第三十二页,共四十八页,编辑于2023年,星期二finally块中语句不执行的唯一情况异常处理代码中执行System.exit(1)退出Java虚拟机try-catch-finallypublicclassTest5{ publicstaticvoidmain(String[]args){ try{ Scannerin=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语句块不执行的唯一情况

}finally{

System.out.println("感谢使用本程序!"); } }}四、异常处理第三十三页,共四十八页,编辑于2023年,星期二publicvoidmethod(){try{//代码段

//产生异常(异常类型2)}catch(异常类型1ex){//对异常进行处理的代码段}catch(异常类型2ex){//对异常进行处理的代码段}catch(异常类型3ex){//对异常进行处理的代码段}//代码段}一段代码可能会引发多种类型的异常当引发异常时,会按顺序来查看每个catch语句,并执行第一个与异常类型匹配的catch语句执行其中一条catch语句后,其后catch语句将被忽略try

与异常类型1不匹配try-catch块后的代码段发生异常产生异常对象catch与异常类型2匹配catchcatch程序继续执行进入catch块多重catch块四、异常处理第三十四页,共四十八页,编辑于2023年,星期二多重catch块2-2publicclassTest6{ publicstaticvoidmain(String[]args){ try{ Scannerin=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语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,即先子类后父类演示示例:使用多重catch处理异常第三十五页,共四十八页,编辑于2023年,星期二练习——根据编号输出课程名称需求说明:按照控制台提示输入1~3之间任一个数字,程序将输出相应的课程名称根据键盘输入进行判断。如果输入正确,输出对应课程名称。如果输入错误,给出错误提示不管输入是否正确,均输出“欢迎提出建议”语句完成时间:20分钟第三十六页,共四十八页,编辑于2023年,星期二共性问题集中讲解常见调试问题及解决办法代码规范问题共性问题集中讲解第三十七页,共四十八页,编辑于2023年,星期二声明异常Java语言中通过throws声明某个方法可能抛出的各种异常可以同时声明多个异常,之间由逗号隔开publicclassTest7{ publicstaticvoiddivide()

throwsException{ Scannerin=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(String[]args){

try{

divide();

}catch(Exceptione){ e.printStackTrace();

} }// publicstaticvoidmain(String[]args)throwsException{// divide();// }}divide()方法没有处理异常,而是声明异常方式1:调用者通过try-catch捕获并处理异常方式2:调用者通过throws继续声明异常演示示例:使用throws声明异常四、异常处理第三十八页,共四十八页,编辑于2023年,星期二除了系统自动抛出异常外,有些问题需要程序员自行抛出异常publicclassPerson{ privateStringname="";//姓名

privateintage=0;//年龄

privateStringsex="男";//性别

publicvoidsetSex(Stringsex)throwsException{ if("男".equals(sex)||"女".equals(sex)) this.sex=sex; else{

thrownewException("性别必须是“男”或者“女”!"); } } publicvoidprint(){ System.out.println(+"("+this.sex +","+this.age+"岁)"); }}publicclassTest8{ publicstaticvoidmain(String[]args){ Personperson=newPerson();

try{ person.setSex("Male"); person.print();

}catch(Exceptione){

e.printStackTrace();

} }}抛出异常捕获异常,或者throws异常抛出异常演示示例:使用throw抛出异常四、异常处理第三十九页,共四十八页,编辑于2023年,星期二五、项目学做1.项目目标(1)了解Throwable类及其子类;(2)了解运行时异常;(3)掌握如何捕获异常、声明异常和抛出异常;(4)掌握如何自定义异常;(5)正确使用异常处理机制;2.项目任务虚拟银行取钱过程,如果取钱数大于余额时需要做异常处理。假如取钱2000,余额为1500元,就会出现预计好的异常处理消息。第四十页,共四十八页,编辑于2023年,星期二(1)银行类classBank{ doublebalance;//存款数 Bank(doublebalance){this.balance=balance; } publicvoiddeposite(doubledAmount){ if(dAmount>0.0)balance+=dAmount; } publicvoidwithdrawal(doubledAmount)throwsInsufficientFundsException{ if(balance<dAmount)thrownewInsufficientFundsException(this,dAmount); balance=balance-dAmount; } publicvoidshowBalance(){ System.out.println("Thebalanceis"+(int)balance); }}五、项目学做第四十一页,共四十八页,编辑于2023年,星期二(2)自定义异常类publicclassInsufficientFundsExceptionextendsException{ privateBankexcepbank;//银行对象 privatedoubleexcepAmount;//要取的钱 InsufficientFundsException(Bankba,doubledAmount){

excepbank=ba; excepAmount=dAmount; } publicStringexcepMessage(){ Stringstr="Thebalanceis"+excepbank.balance+"\n" +"Thewithdrawalwas"+excepAmount; returnstr; }}//异常类五、项目学做第四十二页,共四十八页,编辑于2023年,星期二(3)前端调用类publicclassExceptionDemo{ publicstaticvoidmain(Stringargs[]){ try{

Bankba=newBank(1500); ba.withdrawal(2000); System.out.println("Withdrawalsuccessful!"); }catch(InsufficientFundsExceptione){ System.out.pri

温馨提示

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

评论

0/150

提交评论