收藏 分享(赏)

java学习课件 第九章 异常处理.ppt

上传人:fmgc7290 文档编号:8007390 上传时间:2019-06-03 格式:PPT 页数:45 大小:1.10MB
下载 相关 举报
java学习课件 第九章 异常处理.ppt_第1页
第1页 / 共45页
java学习课件 第九章 异常处理.ppt_第2页
第2页 / 共45页
java学习课件 第九章 异常处理.ppt_第3页
第3页 / 共45页
java学习课件 第九章 异常处理.ppt_第4页
第4页 / 共45页
java学习课件 第九章 异常处理.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、第九章 异常处理,9.1 异常处理的基本概念 9.2 异常处理类 9.3 捕获与异常处理 9.4 抛出异常 9.5 自定义异常,引入,我们总是试图避免在软件程序中错误的发生,但是百分之百没有错误的程序是不存在的。无论怎样,如果我们能适当的处理错误,将会极大的改善程序的可读性、可靠性以及可维护性。Java编程语言使用异常来处理错误。这章主要讲述在什么时候和怎样使用异常来处理错误。,2019/6/3,3,9.1 异常处理的基本概念,语法错误:编译时被检测出来的错误,这种错误一旦产生并不会生成运行代码。 运行错误:在程序运行时代码序列中产生的一种出错情况。这种运行错误倘若没有及时进行处理,可能会造成

2、程序中断、数据遗失乃至系统崩溃等问题。这种运行错误也就是我们常说的“异常”,2019/6/3,4,9.1.1 错误与异常,运行错误是程序运行过程中产生的错误,根据性质的不同,运行错误又分为系统运行错误和逻辑运行错误。 系统运行错误简称为错误,是指程序在执行过程中所产生对操作系统的损害。 逻辑运行错误是指程序不能实现程序员的设计意图和设计功能而产生的错误,这种错误也被称为异常。,例1,public class TestEx1 public static void main(String args)System.out.println(1 / 0) ; ,例2,public class TestE

3、x2 public static void main(String args)System.out.println(“- 异常发生之前 -“) ;System.out.println(1 / 0) ;System.out.println(“- 异常发生之后 -“) ; ,异常是指在程序运行过程中发生的错误,会打断程序正常执行。,该语句未被执行,9.1 异常处理的基本概念,2019/6/3,8,9.1.2 Java语言的异常处理机制,Java异常处理机制,简单地说,就是程序在运行时,发现异常的代码可以“抛出”一个异常,运行系统“捕获”该异常,并交由程序员编写的相应代码进行异常处理。,2019/6

4、/3,9,9.2 异常处理类,由于Java语言中定义了很多异常类,而每个异常类都代表一种运行错误,所以说,Java的异常类是处理运行时错误的特殊类,类中包含了该运行错误的信息和处理错误的方法等内容。,2019/6/3,程序对错误与异常的处理方式有三种:一是程序不能处理的错误;二是程序应避免而不捕获的运行时异常;三是必须捕获的非运行时异常。,9.2 异常处理类,异常处理类的继承关系,1.观察 io类-FileInputStreamread() 方法 2.此方法结构为:public int read() throws IOException 3.此处的 IOException属于必须捕获的非运行时

5、异常,课堂练习,借助API文档,观察异常的分类。,小结,Java中定义了很多异常类,每个异常类都代表了一种常见的运行错误,类中包含了该运行错误的信息和处理错误的方法等内容。 每当Java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象。 一旦一个异常对象产生了,就将其抛出到其调用程序中,发出已经发生问题的信号。 然后,调用方法捕获抛出的异常,在可能时,再恢复回来。,9.2 异常处理类,2019/6/3,14,9.3 捕获与处理异常,在Java语言中,异常处理是通过try、catch、finally、throw、throws五个关键

6、字来实现的。异常处理的理论似乎很繁琐,但实际使用时并不复杂。,2019/6/3,15,当一个异常类的对象被捕获或接收后,用户程序就会发生流程跳转,系统终止当前的流程而跳转到专门的异常处理语句块,或直接跳出当前程序和java虚拟机回到操作系统。,2019/6/3,16,在Java的异常处理机制中,提供了try-catch-finally语句来捕获和处理一个或多个异常,其语法格式如下:,try/监视/可能发生异常的程序代码 catch(异常类型 e )/捕获, e 为异常对象名 /对异常的处理代码,比如输出异常信息 finally/此语句块可以缺省 /无论是否发生异常都要执行的程序代码 ,2019

7、/6/3,17,catch块紧跟在try块的后面,用来接收try块可能产生的异常,一个catch语句块通常会用同样方式来处理它所接收到的所有异常,但是实际上一个try块可能产生多种不同的异常,如果希望能采取不同的方法来处理这些不同的异常,就需要使用多异常处理机制。,public class TestEx3 public static void main(String args)System.out.println(“- 异常发生之前 -“) ;trySystem.out.println(1 / 0) ;catch (ArithmeticException ae)System.out.print

8、ln(“发生异常类:“) ;System.out.println(ae) ;System.out.println(“- 异常发生之后 -“) ; ,例:使用try/catch进行异常处理,这说明使用trycatch后使程序继续向后运行。,2019/6/3,20,【例9.2】使用try-catch-finally语句对例9.1中产生的异常进行捕获与处理。,/app9_2.java 异常的捕获与处理 public class app9_2 public static void main(String args)int i;int a=1,2,3,4; for (i=0;i5;i+)trySyste

9、m.out.print(“a”+i+”/”+i+”=”+(ai/i);catch(ArrayIndexOutOfBoundsException e)System.out.print(“捕获到了数组下标越界异常”);,2019/6/3,21,【例9.2】续,catch(ArithmeticException e)System.out.print(“异常类名称是:”+e); /显示异常信息catch(Exception e)System.out.println(“捕获”+e.getMessage()+”异常!”); /显示异常信息finallySystem.out.println(“ finall

10、y i=”+i);System.out.println(“继续!”); ,2019/6/3,22,程序运行结果为: 异常类名称是:java.lang.ArithmeticException:/ by zero finally i=0 a1/1=2 finally i=1 a2/2=1 finally i=2 a3/3=1 finally i=3 捕获到了数组下标越界异常 finally i=4 继续!,获得异常类的有关信息,获取异常性质的三个方法: public String toString():返回描述异常类信息的字符串。 public void printStackTrace():输出当

11、前异常对象的堆栈使用轨迹。 public String getMessage():返回错误性质。 例:,多个catch 块,多个catch 块,单个try块能有许多catch块,当try块有可以引起不同型异常的语句时,这是必须的。下列代码包括三种类型的异常。例: public class TryCatch public static void main(String args) int array=0,0;int num1,num2,result=0;num1=100; num2=0;,try result = num1/num2;System.out.println(num1/array2)

12、;/更多语句 catch (ArithmeticException e) System.out.println(“Error,Division by zero “) ; catch (ArrayIndexOutOfBoundsException e)System.out.println(“Error.Out of bounds“); catch (Exception e)System.out.println(“Some other error: “); System.out.println(“The result is:“+result);/程序继续 ,分析:,1.在上述代码里,try块有许多

13、语句而每个语句都能引起异常。有三个catch块跟随try块,其中一个处理每个异常类型。2.拥有最特殊异常类的catch块必须先写。例如:如果你先写有Exception(异常)类的catch块,其他catch块将永远不被执行。javac编译器将给出错误说明,告诉特殊的异常捕获尚未得到。这是因为Exception类是所有异常的父类,处理引发的所有异常。3.你是否注意到,在try块的第二语句没有执行。这是因为当异常发生时,程序的流程被打断,然后执行在特定catch块的语句。,作业,1.编写一个能通过编译但是运行时会出现ArithmeticException异常的程序。 2.实验45,2019/6/3

14、,29,9.4 抛出异常,根据异常类的不同,抛出异常的方法也不相同。 1系统自动抛出的异常:所有系统定义的运行异常都可以由系统自动抛出。,2. throw语句抛出异常,通常情况下,异常是由系统自动捕获的。但程序员也可以自己通过throw语句抛出异常。throw语句的格式为: throw new 异常类名(信息) 其中异常类名为系统异常类名或用户自定义的异常类名,“信息”是可选信息。如果提供了该信息,toString()方法的返回值中将增加该信息内容。 例:9.3 注意第10行语句手动抛出异常,3抛出异常的方法与调用方法处理异常;,throws短语:如果不在方法中直接处理可能发生的异常,可以声明

15、方法时加上throws短语,而要求在调用这个方法时捕获这个异常并处理。(当然,调用这个方法的方法也可以再次将异常抛出) 格式:throws 异常类型,class MathDemo / 此方法有没有可能发生异常?public int div(int i,int j)return i / j ; public class TestEx4 public static void main(String arg)System.out.println(new MathDemo().div(10,0) ;,改进:div方法抛出异常,在调用这个方法时捕获这个异常并处理.,class MathDemo / 此方

16、法有没有可能发生异常?public int div(int i,int j) throws Exceptionreturn i / j ; public class TestEx4 public static void main(String arg)trySystem.out.println(new MathDemo().div(10,0) ;catch (Exception e)System.out.println(e) ; ,class MathDemo / 此方法有没有可能发生异常?public int div(int i,int j) throws Exceptionreturn i

17、 / j ; public class TestEx4 public static void main(String arg) throws ExceptionSystem.out.println(new MathDemo().div(10,0) ; ,在main方法中再次将异常抛出,观察运行结果,则发现异常交给JVM 去处理了。,4.由方法抛出异常交系统处理。,class MathDemo / 此方法有没有可能发生异常?public int div(int i,int j) throws Exceptionreturn i / j ; public class TestEx4 public

18、static void main(String arg) throws ExceptionSystem.out.println(new MathDemo().div(10,0) ; ,观察运行结果,则发现异常交给JVM 去处理了。默认情况下所有的异常都是交给JVM去处理了。,4.由方法抛出异常交系统处理。,9.5自定义Java异常,若用户程序有其特殊的逻辑要求,可以通过java的异常处理机制来处理用户自定义的异常,这时用户可以自定义异常,但必须继承自Throwable 或Exception类,建议用Exception类,9.5自定义Java异常,自定义异常的基本形式如下所示:class MyE

19、xception extends Exception MyException(String ErrorMessage)/构造方法Super(ErrorMessage);/父类的构造方法 。 说明:1.异常是一个类,用户定义的异常必须继承自Throwable 或Exception类,建议用Exception类 2.为自定义的异常类定义属性和方法,或覆盖父类方法等,使这些属性和方法能体现该类异常所对应的错误信息。,9.5自定义Java异常,3.字符串ErrorMessage即为要输出的错误信息。若要抛出用户自定义的异常对象,则使用throws 关键字,其使用方法如下:throw new MyExc

20、eption(“错误信息”);程序在执行过程中,若满足了某种异常条件,则相应的异常对象将会被创建,然后抛出。,自定义异常举例: 编写一个程序SumException,使用自定义的异常类NumberRangerException类来计算0-100之间的两个整数的和。用户键盘输入两个数字,如果其中一个数字超出范围将显示 “输入的整数必须在0-100之间”,否则计算两数的和。,import java.util.*;/自定义异常类 class NumberRangerException extends Exception NumberRangerException(String ErrorMessag

21、e )/构造方法super(ErrorMessage);/父类的构造方法 public class SumException public static int sum(int num1,int num2) throws NumberRangerException if(num1100)|(num2100)throw new NumberRangerException(“输入的整数必须在0-100之间“);return num1+num2;,public static void main(String args) int num1,num2;try Scanner reader=new Sca

22、nner(System.in); System.out.println(“请输入第一个整数“); num1=reader.nextInt( ); System.out.println(“请输入第二个整数“); num2=reader.nextInt( ); System.out.println(“两数的和为:“+sum(num1,num2);catch(NumberRangerException e ) /调用NumberRangerException类中的getMessage()方法输出出错信息 System.out.println(e.getMessage();,异常处理小结,1.异常处理

23、机制:监视(抛出异常)捕获处理 try catch语句: try/监视/可能发生异常的程序代码 catch(异常类型 e )/捕获, e 为异常对象名 /对异常的处理代码,比如输出异常信息 finally/此语句块可以缺省 /无论是否发生异常都要执行的程序代码 ,异常处理小结(续),2.异常的两种处理方式: try catch.finally throw及throws,1自定义一个异常DevideByMinusException(除数不能为负的异常),假定该异常类为ArithmeticException的子类。,作业,2 (1)设计一个银行帐户管理类Account 属性:账号,帐户余额 方法:

24、 构造方法:设置账号,余额 查询余额(query): 显示余额deposit: 存款方法,参数是double型的金额 withdraw:取款方法,参数是double型的金额(2) 创建的帐户类,其中定义存钱、取钱等两个个方法附加下述异常: a. AccountOverdrawnException当有了这个要取出比帐户上更多的钱的尝试时。 b. InvalidDepositException当无效钱数(小于0)存入时。 设计一个TestAccount类创建一个用户的帐户,余额为1000元查询余额,存入200元,取出500元显示用户账号和余额查询余额,取出5000元显示用户账号和查询余额.,作业,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报