异常处理机制精.ppt
异常处理机制第1页,本讲稿共48页课程内容二二三三四四五五一一第2页,本讲稿共48页v在进行程序设计时,错误的产生是不可避免的在进行程序设计时,错误的产生是不可避免的如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?v这是任何程序设计语言都要解决的问题这是任何程序设计语言都要解决的问题一、传统处理方式一、传统处理方式第3页,本讲稿共48页vclass Calculate vstatic void calculate(int num1,int num2)vint nResult;vnResult=num1+num2;/加法运算vSystem.out.println(和=+nResult);vnResult=num1-num2;/减法运算vSystem.out.println(差=+nResult);vnResult=num1*num2;/乘法运算vSystem.out.println(积=+nResult);v/除法运算,先判断分母为0 不?注1vif(num2!=0)vnResult=num1/num2;vSystem.out.println(商=+nResult);vvelsevSystem.out.println(Error,没有商,除数为0!);vv一、传统处理方式一、传统处理方式第4页,本讲稿共48页vif(num2!=0)nResult=num1%num2;v System.out.println(余数=+nResultn第二次运算);velsevSystem.out.println(Error,没有余数,除数为0!);vvvvpublic class Traditional vpublic static void main(String aaa)vint x=9,y=6;vCalculate.calculate(x,y);/注3vx=7;vy=0;vCalculate.calculate(x,y);/注4vv一、传统处理方式一、传统处理方式运行结果:和=15差=3积=54商=1余数=3第二次运算和=7积=0Error,没有商,除数为0!Error,没有余数除数为0!第5页,本讲稿共48页程序可读性差,大量的错误处理代码混杂在程序中程序可读性差,大量的错误处理代码混杂在程序中观察前面的程序,会发现大部分精力花在出错处理上观察前面的程序,会发现大部分精力花在出错处理上只把能够想到的错误考虑到,此外的情况无法处理只把能够想到的错误考虑到,此外的情况无法处理出错返回信息量太少,无法更确切的了解错误状况或原因出错返回信息量太少,无法更确切的了解错误状况或原因以常规方法处理错误存在的问题以常规方法处理错误存在的问题一、传统处理方式一、传统处理方式第6页,本讲稿共48页所谓所谓错误错误,是在程序运行过程中发生的异常事件,比如除,是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的强壮性(序的正常运行。为了加强程序的强壮性(robust),程序),程序设计时,必须考虑到可能发生的异常事件并做出相应的处设计时,必须考虑到可能发生的异常事件并做出相应的处理。理。二、二、JavaJava异常处理机制异常处理机制第7页,本讲稿共48页vJava异常是异常是Java提供的用于处理程序中错误的一种机制。提供的用于处理程序中错误的一种机制。v所谓错误是指在程序运行过程中发生的一些异常事件(如:除所谓错误是指在程序运行过程中发生的一些异常事件(如:除0溢溢出,数组下标越界,所要读取的文件不存在)。出,数组下标越界,所要读取的文件不存在)。v设计良好的程序应该在异常发生时提供处理这些错误的方法,设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。使得程序不会因为异常的发生而阻断或产生不可预见的结果。二、二、JavaJava异常处理机制异常处理机制第8页,本讲稿共48页vJava程序的执行过程中如出现异常事件,可以生成一个异常类对象,程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给该异常对象封装了异常事件的信息并将被提交给Java运行时系统,运行时系统,这个过程称为抛出(这个过程称为抛出(throw)异常。)异常。v当当Java运行时系统接收到异常对象时,会寻找处理这一异常的运行时系统接收到异常对象时,会寻找处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。)异常。二、二、JavaJava异常处理机制异常处理机制第9页,本讲稿共48页 三、三、JavaJava异常类异常类vJ2SDK定义了很多异常类,这些类对应了各种各样可能出现的异定义了很多异常类,这些类对应了各种各样可能出现的异常事件。常事件。ThrowableEorrorExceptionRuntimeException第10页,本讲稿共48页vError:称为错误,由称为错误,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。(也处理不了)虚拟机错误等,程序对其不做处理。(也处理不了)vException:所有异常类的父类,其子类对应了各种各样可能出现:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显式的声明或捕获。的异常事件,一般需要用户显式的声明或捕获。vRuntime Exception:一类特殊的异常,如被:一类特殊的异常,如被0除、数据下标越界除、数据下标越界等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。缺省的异常处理程序(用户可不必对其处理)。三、三、JavaJava异常类异常类第11页,本讲稿共48页v所有的包中都定义了异常类和错误类。所有的包中都定义了异常类和错误类。vException类是所有异常的父类类是所有异常的父类vError类是所有错误的父类,这两个类都实现了类是所有错误的父类,这两个类都实现了Throwable接口。接口。三、三、JavaJava异常类异常类第12页,本讲稿共48页NCEPU3 异常分类 ThrowableErrorException虚拟机错误虚拟机错误内存溢出错误内存溢出错误图形界面错误图形界面错误内存溢内存溢出错误出错误栈溢出栈溢出错误错误类定义未类定义未找到错误找到错误第13页,本讲稿共48页NCEPU3 异常分类 ThrowableErrorExceptionRuntimeException运行时异常运行时异常文件已文件已结束异常结束异常文件未文件未找到异常找到异常方法未方法未找到异常找到异常输入输出输入输出异常异常图形界面图形界面异常异常第14页,本讲稿共48页NCEPU3 异常分类 ThrowableErrorExceptionRuntimeException运行时异常运行时异常算术算术异常异常类型强制类型强制转换异常转换异常方法未方法未找到异常找到异常输入输出输入输出异常异常图形界面图形界面异常异常空指针空指针异常异常数组负数组负下标异常下标异常违背安全违背安全原则异常原则异常数组下标越界异常数组下标越界异常下标越界异常下标越界异常IndexOutOfBoundsExceptioncatch(ArrayIndexOutOfBoundsException e)catch(IndexOutOfBoundsException e)catch(RuntimeException e)catch(Exception e)catch(Throwable e)第15页,本讲稿共48页v算术异常算术异常ArithmeticException整数除法中,若除数为整数除法中,若除数为0 0,或用,或用0 0取模,会发生该异常。取模,会发生该异常。例如:例如:int i=12/0;int m=5%0;其他算术操作不会产生异常其他算术操作不会产生异常 几个常见的公用异常类几个常见的公用异常类 三、三、JavaJava异常类异常类第16页,本讲稿共48页v空指针异常空指针异常NullPointerException当程序试图访问一个空对象(即没有实例化的对象)中的变量或方当程序试图访问一个空对象(即没有实例化的对象)中的变量或方法,或一个空数组中的元素时,会发生该异常。法,或一个空数组中的元素时,会发生该异常。例如:例如:int a =null;a 0 =0;String s=null;System.out.println(s.length();几个常见的公用异常类几个常见的公用异常类 三、三、JavaJava异常类异常类第17页,本讲稿共48页v类型强制转换异常类型强制转换异常ClassCastException当进行类型强制转换时,对于不能进行的转换操作,会发生当进行类型强制转换时,对于不能进行的转换操作,会发生该异常。该异常。例如:例如:Object obj=new Object();String s=(String)obj;几个常见的公用异常类几个常见的公用异常类 三、三、JavaJava异常类异常类第18页,本讲稿共48页v数组负下标异常数组负下标异常NagativeArraySizeException创建数组时,若数组元素个数为负,会发生该异常。创建数组时,若数组元素个数为负,会发生该异常。例如:例如:int a =new int -3;几个常见的公用异常类几个常见的公用异常类 三、三、JavaJava异常类异常类第19页,本讲稿共48页v数组下标越界异常数组下标越界异常ArrayIndexOutOfBoundsException试图访问一个越界的数组元素时(即下标大于等于数组的成员变量试图访问一个越界的数组元素时(即下标大于等于数组的成员变量length),会发生该异常。会发生该异常。例如:例如:int a =new int 1;a 1 =3;几个常见的公用异常类几个常见的公用异常类 三、三、JavaJava异常类异常类第20页,本讲稿共48页vArithmeticExceptionvNullPointerExceptionvClassCastExceptionvNagativeArraySizeExceptionvArrayIndexOutOfBoundsException都是运行时异常类都是运行时异常类(RuntimeException)的子类的子类几个常见的公用异常类几个常见的公用异常类 三、三、JavaJava异常类异常类第21页,本讲稿共48页常见的异常类型 方 法 名说 明Exception 异常层次结构的根类ArithmeticException算术错误情形,如以零作除数ArrayIndexOutOfBoundsException数组下标越界NullPointerException尝试访问 null 对象成员ClassNotFoundException不能加载所需的类InputMismatchException欲得到数据类型与实际输入类型不匹配IllegalArgumentException方法接收到非法参数ClassCastException对象强制类型转换出错NumberFormatException数字格式转换异常,如把abc转换成数字第22页,本讲稿共48页vJava的异常处理是通过的异常处理是通过5个关键字来实现的:个关键字来实现的:try、catch、finally、throw、throws 捕获异常 catchtryfinally执行可能产生 异常的代码 捕获异常 无论是否发生异常,代码总能执行手动抛出异常 抛出异常 throw声明异常 声明方法可能要抛出的各种异常 throws四、异常处理四、异常处理第23页,本讲稿共48页trycatch try-catch 块后的代码段public void method()try /代码段(此处不会产生异常)catch(异常类型 ex)/对异常进行处理的代码段/代码段v使用使用try-catch块捕获异常,分为三种情况:块捕获异常,分为三种情况:第一种情况 四、异常处理四、异常处理第24页,本讲稿共48页public class Test3 public static void main(String args)try Scanner in=new Scanner(System.in);System.out.print(请输入被除数:);int num1=in.nextInt();System.out.print(请输入除数:);int num2=in.nextInt();System.out.println(String.format(%d/%d=%d,num1,num2,num1/num2);System.out.println(感谢使用本程序!);catch(Exception e)System.err.println(出现错误:被除数和除数必须是整数,+除数不能为零。);e.printStackTrace();try-catch块v使用示例模拟第一种情况:使用示例模拟第一种情况:输入:200,40演示示例:使用try-catch处理异常四、异常处理四、异常处理第25页,本讲稿共48页trycatch异常类型匹配 try-catch 块后的代码段进入catch块public void method()try /代码段 1 /产生异常的代码段 2 /代码段 3 catch(异常类型 ex)/对异常进行处理的代码段4/代码段5v使用使用try-catch块捕获异常,分为三种情况:块捕获异常,分为三种情况:第二种情况 产生异常对象 程序继续执行异常是一种特殊的对象,类型为java.lang.Exception或其子类 发生异常try-catch块四、异常处理四、异常处理第26页,本讲稿共48页public class Test3 public static void main(String args)try Scanner in=new Scanner(System.in);System.out.print(请输入被除数:);int num1=in.nextInt();System.out.print(请输入除数:);int num2=in.nextInt();System.out.println(String.format(%d/%d=%d,num1,num2,num1/num2);System.out.println(感谢使用本程序!);catch(Exception e)System.err.println(出现错误:被除数和除数必须是整数,+除数不能为零。);e.printStackTrace();try-catch块v使用示例模拟第二种情况:使用示例模拟第二种情况:输入:B输入:200,0演示示例:使用try-catch处理异常四、异常处理四、异常处理第27页,本讲稿共48页vprintStackTrace的堆栈跟踪功能显示出程序的堆栈跟踪功能显示出程序运行到当前类的执行流程运行到当前类的执行流程 java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.java:840)at java.util.Scanner.next(Scanner.java:1461)at java.util.Scanner.nextInt(Scanner.java:2091)at java.util.Scanner.nextInt(Scanner.java:2050)at cn.jbit.exception.Test3.main(Test3.java:15)异常类型异常堆栈信息在此方法中抛出了异常try-catch块出现异常的位置四、异常处理四、异常处理第28页,本讲稿共48页trycatch异常类型不匹配 try-catch 块后的代码段程序中断运行 发生异常public void method()try /代码段 1 /产生异常的代码段 2 /代码段 3 catch(异常类型 ex)/对异常进行处理的代码段4/代码段5v使用使用try-catch块捕获异常,分为三种情况:块捕获异常,分为三种情况:第三种情况 产生异常对象 try-catch块四、异常处理四、异常处理第29页,本讲稿共48页try-catch块v在在catch块中处理异常块中处理异常加入用户自定义处理信息调用异常对象的方法输出异常信息e.printStackTrace();System.err.println(出现错误:被除数和除数必须是整数,+除数不能为零。);方法名说 明void printStackTrace()输出异常的堆栈信息String getMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分四、异常处理四、异常处理第30页,本讲稿共48页v在在try-catch块后加入块后加入finally块,可以确保无论块,可以确保无论是否发生异常,是否发生异常,finally块中的代码总能被执行块中的代码总能被执行try 块 finally 块 catch 块 无异常 有异常 try-catch-finally四、异常处理四、异常处理第31页,本讲稿共48页public class Test4 public static void main(String args)try Scanner in=new Scanner(System.in);System.out.print(请输入被除数:);int num1=in.nextInt();System.out.print(请输入除数:);int num2=in.nextInt();System.out.println(String.format(%d/%d=%d,num1,num2,num1/num2);catch(Exception e)System.err.println(“出现错误:被除数和除数必须是整数,+除数不能为零。);System.out.println(e.getMessage();finally System.out.println(感谢使用本程序!);try-catch-finally输入:200 40输入:200 0第一种情况:无异常第二种情况:有异常 演示示例:使用try-catch-finally处理异常四、异常处理四、异常处理第32页,本讲稿共48页vfinally块中语句不执行的唯一情况块中语句不执行的唯一情况异常处理代码中执行System.exit(1)退出Java虚拟机 try-catch-finallypublic class Test5 public static void main(String args)try Scanner in=new Scanner(System.in);System.out.print(请输入被除数:);int num1=in.nextInt();System.out.print(请输入除数:);int num2=in.nextInt();System.out.println(String.format(%d/%d=%d,num1,num2,num1/num2);catch(Exception e)System.err.println(出现错误:被除数和除数必须是整数,+除数不能为零);System.exit(1);/finally语句块不执行的唯一情况 finally System.out.println(感谢使用本程序!);四、异常处理四、异常处理第33页,本讲稿共48页public void method()try /代码段 /产生异常(异常类型2)catch(异常类型1 ex)/对异常进行处理的代码段 catch(异常类型2 ex)/对异常进行处理的代码段 catch(异常类型3 ex)/对异常进行处理的代码段/代码段v一段代码可能会引发多种类型的异常一段代码可能会引发多种类型的异常v当引发异常时,会按顺序来查看每个当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个语句,并执行第一个与异常类型匹配的与异常类型匹配的catch语句语句v执行其中一条执行其中一条 catch 语句后,其后语句后,其后 catch 语句将被忽略语句将被忽略 try 与异常类型1不匹配try-catch 块后的代码段发生异常产生异常对象catch与异常类型2匹配catchcatch程序继续执行进入catch块多重catch块四、异常处理四、异常处理第34页,本讲稿共48页多重catch块 2-2public class Test6 public static void main(String args)try Scanner in=new Scanner(System.in);System.out.print(请输入被除数:);int num1=in.nextInt();System.out.print(请输入除数:);int num2=in.nextInt();System.out.println(String.format(%d/%d=%d,num1,num2,num1/num2);catch(InputMismatchException e)System.err.println(被除数和除数必须是整数。);catch(ArithmeticException e)System.err.println(除数不能为零。);catch(Exception e)System.err.println(其他未知异常。);输入:B 进入第一个catch块输入:200 0 进入第二个catch块在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,即先子类后父类 演示示例:使用多重catch处理异常第35页,本讲稿共48页练习根据编号输出课程名称v需求说明:需求说明:按照控制台提示输入13之间任一个数字,程序将输出相应的课程名称根据键盘输入进行判断。如果输入正确,输出对应课程名称。如果输入错误,给出错误提示不管输入是否正确,均输出“欢迎提出建议”语句完成时间:20分钟第36页,本讲稿共48页共性问题集中讲解n常见调试问题及解决办法n代码规范问题共性问题集中讲解第37页,本讲稿共48页声明异常vJava语言中通过语言中通过throws声明某个方法可能抛出声明某个方法可能抛出的各种异常的各种异常v可以同时声明多个异常,之间由逗号隔开可以同时声明多个异常,之间由逗号隔开 public class Test7 public static void divide()throws Exception Scanner in=new Scanner(System.in);System.out.print(请输入被除数:);int num1=in.nextInt();System.out.print(请输入除数:);int num2=in.nextInt();System.out.println(String.format(%d/%d=%d,num1,num2,num1/num2);public static void main(String args)try divide();catch(Exception e)e.printStackTrace();/public static void main(String args)throws Exception/divide();/divide()方法没有处理异常,而是声明异常方式1:调用者通过try-catch捕获并处理异常 方式2:调用者通过throws继续声明异常 演示示例:使用throws声明异常四、异常处理四、异常处理第38页,本讲稿共48页v除了系统自动抛出异常外,有些问题需要程序员除了系统自动抛出异常外,有些问题需要程序员自行抛出异常自行抛出异常 public class Person private String name=;/姓名private int age=0;/年龄private String sex=男;/性别public void setSex(String sex)throws Exception if(男.equals(sex)|女.equals(sex)this.sex=sex;else throw new Exception(性别必须是“男”或者“女”!);public void print()System.out.println(this.name+(+this.sex+,+this.age+岁));public class Test8 public static void main(String args)Person person=new Person();try person.setSex(Male);person.print();catch(Exception e)e.printStackTrace();抛出异常捕获异常,或者throws异常抛出异常演示示例:使用throw抛出异常四、异常处理四、异常处理第39页,本讲稿共48页五、项目学做五、项目学做v1.项目目标项目目标v(1)了解)了解Throwable类及其子类;类及其子类;v(2)了解运行时异常;)了解运行时异常;v(3)掌握如何捕获异常、声明异常和抛出异常;)掌握如何捕获异常、声明异常和抛出异常;v(4)掌握如何自定义异常;)掌握如何自定义异常;v(5)正确使用异常处理机制;)正确使用异常处理机制;v2.项目任务项目任务v虚拟银行取钱过程,如果取钱数大于余额时需要做异虚拟银行取钱过程,如果取钱数大于余额时需要做异常处理。假如取钱常处理。假如取钱2000,余额为,余额为1500元,就会出元,就会出现预计好的异常处理消息。现预计好的异常处理消息。第40页,本讲稿共48页v(1)银行类vclass Bank vdouble balance;/存款数vBank(double balance)this.balance=balance;vvpublic void deposite(double dAmount)vif(dAmount 0.0)balance+=dAmount;vvpublic void withdrawal(double dAmount)throws InsufficientFundsException vif(balance dAmount)throw new InsufficientFundsException(this,dAmount);vbalance=balance-dAmount;vvpublic void showBalance()vSystem.out.println(The balance is +(int)balance);vv五、项目学做五、项目学做第41页,本讲稿共48页v(2)自定义异常类vpublic class InsufficientFundsException extends Exception vprivate Bank excepbank;/银行对象vprivate double excepAmount;/要取的钱vInsufficientFundsException(Bank ba,double dAmount)vexcepbank=ba;vexcepAmount=dAmount;vvpublic String excepMessage()vString str=The balance is +excepbank.balance+nv+The withdrawal was +excepAmount;vreturn str;vv/异常类五、项目学做五、项目学做第42页,本讲稿共48页v(3)前端调用类vpublic class ExceptionDemo vpublic static void main(String args)vtry vBank ba=new Bank(1500);vba.withdrawal(2000);vSystem.out.println(Withdrawal successful!);v catch(InsufficientFundsException e)vSystem.out.println(e.toString();vSystem.out.println(e.excepMessage();vvv五、项目学做五、项目学做第43页,本讲稿共48页课后作业课后作业v课后作业课后作业必做教员备课时在此添加内容选做教员备课时在此添加内容提交时间:xxx提交形式:xxxv预习作业预习作业背诵英文单词教员备课时在此添加内容第48页,本讲稿共48页