SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground计算机科学学院夏羽Java程序设计基于Java语言的面向对象程序设计SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground第二部分Java面向对象编程Java程序设计SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground回顾•简述抽象类和接口的应用场合•面向接口编程的好处是什么?提问SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground第十章异常第一节什么是异常Java程序设计SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground生活中的异常•正常情况下,小王每日开车去上班,耗时大约30分钟但是,异常情况迟早要发生!一路畅通堵车!撞车!SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground程序中的异常•以下程序运行时会出现错误吗?publicclassTest1{publicstaticvoidmain(String[]args){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(感谢使用本程序!);}}演示:程序中的异常代码阅读SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground避免异常1•如何解决该问题呢?publicclassTest2{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);…System.out.print(请输入除数:);intnum2=0;if(in.hasNextInt()){//如果输入的除数是整数num2=in.nextInt();……}else{//如果输入的除数不是整数System.err.println(输入的除数不是整数,程序退出。);System.exit(1);}…}}尝试通过if-else来避免异常问题无法处理所有情况演示:使用if-else避免异常SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground避免异常2•如何解决该问题呢?publicclassTest2{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);…System.out.print(请输入除数:);intnum2=0;if(in.hasNextInt()){//如果输入的除数是整数num2=in.nextInt();if(0==num2){//如果输入的除数是0System.err.println(输入的除数是0,程序退出。);System.exit(1);}}else{//如果输入的除数不是整数System.err.println(输入的除数不是整数,程序退出。);System.exit(1);}…}}尝试通过if-else来避免异常问题弊端:1、代码臃肿2、程序员要花很大精力“堵漏洞”3、程序员很难堵住所有“漏洞”使用异常机制SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground什么是异常•异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序•例如:异常程序运行程序中断运行请输入整数用户输入字母程序无法解析程序中断运行请输入整数用户输入数字程序中断运行计算除法除数为0SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground生活中的异常处理绕行或者等待请求交警解决生活中面对异常通常会这样处理堵车!撞车!生活中,根据不同的异常进行相应的处理,而不会就此中断我们的生活SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground程序中的异常处理•Java编程语言使用异常处理机制为程序提供了错误处理的能力程序中预先设置好对付异常的处理办法异常程序运行处理完毕,程序继续运行对异常进行处理SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground•Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throwsJava中如何进行异常处理捕获异常catchtryfinally执行可能产生异常的代码捕获异常无论是否发生异常,代码总能执行手动抛出异常throw声明方法可能要抛出的各种异常throws声明异常抛出异常SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground第十章异常第二节异常处理(try…catch…)Java程序设计SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground•使用try-catch块捕获异常,分为三种情况:trycatchtry-catch块后的代码段publicvoidmethod(){try{//代码段(此处不会产生异常)}catch(异常类型ex){//对异常进行处理的代码段}//代码段}try-catch块1第一种情况:正常演示:使用try-catch处理异常SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground•使用try-catch块捕获异常,分为三种情况:try异常类型匹配try-catch块后的代码段publicvoidmethod(){try{//代码段1//产生异常的代码段2//代码段3}catch(异常类型ex){//对异常进行处理的代码段4}//代码段5}try-catch块2第二种情况:出现异常产生异常对象程序继续执行异常是一种特殊的对象,类型为java.lang.Exception或其子类catch演示:使用try-catch处理异常SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforegroundtry-catch块3•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)异常类型异常堆栈信息在此方法中抛出了异常出现异常的位置SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground•使用try-catch块捕获异常,分为三种情况:trycatch异常类型不匹配try-catch块后的代码段程序中断运行publicvoidmethod(){try{//代码段1//产生异常的代码段2//代码段3}catch(异常类型ex){//对异常进行处理的代码段4}//代码段5}try-catch块4第三种情况:异常类型不匹配产生异常对象异常类型没有匹配,相当于并没有处理异常演示:使用try-catch处理异常SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground•在catch块中处理异常–加入用户自定义处理信息•调用方法输出异常信息•异常对象常用的方法try-catch块5e.printStackTrace();System.err.println(出现错误:被除数和除数必须是整数,”+除数不能为零。);方法名说明voidprintStackTrace()输出异常的堆栈信息StringgetMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground常见的异常类型异常类型说明Exception异常层次结构的父类ArithmeticException算术错误情形,如以零作除数ArrayIndexOutOfBoundsException数组下标越界NullPointerException尝试访问null对象成员ClassNotFoundException不能加载所需的类IllegalArgumentException方法接收到非法参数ClassCastException对象强制类型转换出错NumberFormatException数字格式转换异常,如把abc转换成数字SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground第十章异常第三节异常处理(try…catch…finally)Java程序设计SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforegroundtry-catch-finally1•在try-catch块后加入finally块–是否发生异常都执行–不执行的唯一情况try块finally块catch块无异常有异常System.exit(1)中断程序,退出Java虚拟机演示:使用try-catch-finally处理异常SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforegroundtry-catch-finally2•存在return的try-catch-finally块trycatchreturn异常类型匹配publicvoidmethod(){try{//代码段1//产生异常的代码段2}catch(异常类型ex){//对异常进行处理的代码段3return;}finally{//代码段4}}产生异常对象finally进入catch块执行return退出方法执行finally块try块中有return语句执行过程与此类似2134演示:try块和catch块中return语句的执行SlidesbackgroundSlidestitlePagetitlebackgroundPagetitleforeground•引发多种类型的异常–排列catch语句的顺序:先子类后父类–发生异常时按顺序逐个匹配–只执行第一个与异常类型匹配的c