1、-1-理解异常的概念掌握异常处理机制理解Java异常的分类掌握try、catch、finally使用方法掌握throw、throws的使用方法掌握自定义异常的定义和使用方法 目标目标-2-异常概述异常概述-1 什么是异常什么是异常异常是指由于程序中的错误而导致正常的程序流程中断的一种事件。如:除数为0,数组越界,文件找不到等都属于异常。Java异常分类异常分类 从理论的角度Java中异常分为两类,分别为:p Error(错误):JVM系统内部错误、资源耗尽等严重情况p Exception(异常):因编程错误或偶然的外在因素导致的一般性问题,例如:对负数开平方根、空指针访问、试图读取不存在的文件
2、、网络连接中断等。-3-异常概述异常概述-2 从编程角度考虑可以将异常(从编程角度考虑可以将异常(Exception)分为以下两类)分为以下两类:p非检查型(非检查型(unchecked)异常)异常:是指编译器不要求强制处理的异常,该异常是因设计或实现方式不当导致的问题,是程序员的原因导致的,可以避免这种问题的产生p检查型检查型(checked)异常异常:是指编译器要求必须处理的异常,是程序在运行时由于外界因素造成的一般性异常,该类异常是Exception类型及其子类(RuntimeException类及其子类除外)从开发应用角度考虑可以将异常分为以下两类从开发应用角度考虑可以将异常分为以下两
3、类:p 系统异常系统异常:系统异常在性质上比应用异常更加严重,前者通常和应用逻辑无关,而是底层出现了问题,如数据库服务器的异常终止等。p 应用异常应用异常:应用异常是由于违反了商业规则或者业务逻辑而导致的错误。例如,一个被锁定的用户试图登入应用。-4-Java中的异常体系中的异常体系-5-Java异常处理机制异常处理机制 Java语言提供两种处理异常的机制:语言提供两种处理异常的机制:p捕获异常捕获异常:在程序运行过程中系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码,找到处理这种类型异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,该过程称为捕获(ca
4、tch)异常。p 声明抛出异常声明抛出异常:当运行时系统得到一个异常对象,如果当前方法并不知道如何处理所出现的异常或者此时处理不合适,则可在定义方法时,声明抛出(throws)异常。-6-异常处理异常处理-1Java中关于异常处理涉及到关键字中关于异常处理涉及到关键字 try、catch、finally、throw和和throwsJava中可用于处理异常的两种方式 自行处理:可能引发异常的语句被包含在try块内,而处理异常的相应语句则存在于catch块内。抛出异常:在方法声明中包含throws子句,通知调用者,如果发生了异常,必须由调用者处理。-7-异常处理异常处理-2 异常实例异常实例使用使
5、用0做除数而引发的做除数而引发的ArithmeticException的异常情况的异常情况 执行结果如下:Exception in thread main java.lang.ArithmeticException:/by zeroat com.dh.ch06.ExceptionDemo.main(ExceptionDemo.java:8)public class ExceptionDemo public static void main(String args)/0做除数 int i=12/0;System.out.println(结果是:+i);-8-异常处理异常处理-3 try/catc
6、h 在在Java程序中,如果在出现异常的地方进行异常处理,可以在方法中添加两程序中,如果在出现异常的地方进行异常处理,可以在方法中添加两类代码块,即类代码块,即try、catch,通常发生异常的代码都放在,通常发生异常的代码都放在try代码块中,代码块中,try代码代码块中包含的是可能引起一个或者多个异常的代码;块中包含的是可能引起一个或者多个异常的代码;try代码块的功能就是监视异常的发生。代码块的功能就是监视异常的发生。如果如果try块中的代码产生异常时则由块中的代码产生异常时则由catch块进行捕获并处理块进行捕获并处理,也就是说,也就是说catch代码块中的代码用于处理代码块中的代码用
7、于处理try代码块代码块中抛出的具体异常类型的异常对象。中抛出的具体异常类型的异常对象。语法格式如下:语法格式如下:try /代码段(可能发生异常的代码)catch(Throwable ex)/对异常进行处理的代码段-9-异常处理异常处理-4 try/catch演示演示 public class TryCatchDemo public static void main(String args)/定义一个String变量,值为null String str=null;try i f(str.equals(hello)System.out.println(hello java);catch(Nul
8、lPointerException e)System.out.println(空指针异常);演示结果:空指针异常-10-异常处理异常处理-5 多重多重catch处理异常处理异常在一个程序中可能会引发多种不同类型的异常,此时可以提供多个catch语句用来捕获用户感兴趣的异常。当引发异常时,程序会按顺序按顺序来查看来查看每个catch语句块,并执行第一个与异常类型匹配第一个与异常类型匹配的catch语句块,其后的catch语句块将被忽略。语法格式如下:语法格式如下:try/代码段/产生异常(异常类型2)catch(异常类型1 ex)/对异常进行处理的代码段 catch(异常类型2 ex)/对异常进
9、行处理的代码段 catch(异常类型3 ex)/对异常进行处理的代码段-11-异常处理异常处理-6 嵌套异常处理嵌套异常处理 p 代码块的某一部分引起一个异常,而整个代码块可能又引起另外一个异常。p 此时就需要将一个异常处理程序嵌套到另一个中。p 在使用嵌套的try块时,将先执行内部try块,如果没有遇到匹配的catch块,则将检查外部try块的catch块。public class NestedExceptionDemo public static void main(String args)try try Scanner scanner=new Scanner(System.in);/从控
10、制台中传入两个参数 int number1=Integer.parseInt(scanner.next();int number2=Integer.parseInt(scanner.next();/求商运算 double result=number1/number2;System.out.println(the result is +result);catch(NumberFormatException e)System.out.println(数字格式转换异常!);catch(ArithmeticException e)System.out.println(0做除数无意义!);控制台输入“a
11、aa”演示结果如下:aaa数字格式转换异常!this is the end flag!-12-异常处理异常处理-7 finally在某些特定的情况下,不管是否有异常发生,总是要求某些特定的代码必须在某些特定的情况下,不管是否有异常发生,总是要求某些特定的代码必须被执行,比如进行数据库连接时,不管对数据库的操作是否成功,最后都需被执行,比如进行数据库连接时,不管对数据库的操作是否成功,最后都需要关闭数据库的连接并释放内存资源。这就需要用到要关闭数据库的连接并释放内存资源。这就需要用到finally关键字,关键字,finally不不能单独使用必须和能单独使用必须和try结合使用结合使用,有两种用法
12、:,有两种用法:ptry-finally ptry-catch-finally (较为常用)(较为常用)语法格式如下:语法格式如下:try /代码段(可能发生异常代码)catch(Throwable ex)/对异常进行处理的代码段 finally /总要被执行的代码-13-异常处理异常处理-8 finally实例演示实例演示public class FinallyDemo public static void main(String args)System.out.println(请打开数据库连接.);try System.out.println(执行查询操作);System.out.prin
13、tln(执行修改操作);/使用0做除数int i=12/0;System.out.println(结果是:+i);catch(Exception ex)System.out.println(除零出错!);finally System.out.println(关闭数据库连接.);执行结果如下:请打开数据库连接.执行查询操作执行修改操作除零出错!关闭数据库连接.异常处理异常处理-9 throw/throws 在在Java程序中如果要明确地引发异常,则需要用到程序中如果要明确地引发异常,则需要用到throw或或throws语句语句:pthrow语句语句:throw语句用来明确地抛出一个“异常”。pt
14、hrows语句语句:如果一个方法methodName()可以引发异常,而它本身并不对该异常进行处理,那么该方法必须声明将这个异常抛出,以使程序能够继续执行下去。这时候就要用到throws语句。throws语句的格式如下:语句的格式如下:-14-returnType methodName()throws ExceptionType1,ExceptionType2 /body-15-自定义异常自定义异常-1 Java语言本身提供的异常太贴近于技术,很多情况下需要构建自己的业务异常体系。如下自定义一个异常类ZeroDivideException:public class ZeroDivideExce
15、ption extends Exception public ZeroDivideException()super();public ZeroDivideException(String msg)super(msg);public ZeroDivideException(Throwable cause)super(cause);public ZeroDivideException(String msg,Throwable cause)super(msg,cause);-16-自定义异常自定义异常-2 下述代码对下述代码对ZeroDivideException自定义异常类进行测试。自定义异常类进
16、行测试。public class ZeroDivideExceptionDemo/*测试方法如下*/public static void main(String args)try int result=divide(10,0);System.out.println(结果是:+result);catch(ZeroDivideException ex)/打印异常信息System.out.println(ex.getMessage();/打印异常栈信息ex.printStackTrace();/*ZeroDivideException的使用方法*/public static int divide(i
17、nt oper1,int oper2)throws ZeroDivideException if(oper2=0)throw new ZeroDivideException(0做除数无意义!);return oper1/oper2;-17-Java异常处理机制采用统一和相对简单的抛出和处理错误的机制异常分为Error和Exception两类,Throwable类是两者的父类从编程角度考虑可以将异常分为两类:非检查型异常和检查型异常从应用的角度将异常分为:系统异常和应用异常Error类对象由Java虚拟机生成并抛出,程序无需处理Exception类对象由应用程序处理或抛出,应定义相应处理方案Java使用try、catch、finally来捕获异常Java使用throw、throws来抛出异常Java中可以自定义异常用于满足特殊业务处理小结小结谢 谢 Thanks for listening.