《15-异常1电子课件 Java应用程序设计——从模型到代码.ppt》由会员分享,可在线阅读,更多相关《15-异常1电子课件 Java应用程序设计——从模型到代码.ppt(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、JavaJava面向对象程序面向对象程序设计设计第第1515次次课课-使用异常处理程序错误使用异常处理程序错误回顾什么是常量?Java中,常量的定义规则有哪些?什么是面向接口编程,它的好处是什么?包、类包就像姓,类就像名定义包、导入类为什么要定义包易于找到相应文件更好保护类、数据和方法防止命名冲突定义包package java.shan.chapter5;使用带包的类import java.util.*;import java.lang.*;预习检查什么是异常?Java中,如何进行异常处理?请说明throw 与 throws的区别与联系?本章任务升级HelloACCP,完成如下功能:根据课程代
2、码输出课程名称输出各学期平均课时等信息使用log4j记录异常日志本章目标掌握Java的异常处理机制运用 try、catch、finally 处理异常运用 throw 抛出异常运用 throws 声明异常掌握log4j的用法,能够记录异常日志生活中的异常正常情况下,小王每日开车去上班,耗时大约30分钟但是,异常情况迟早要发生!但是,异常情况迟早要发生!一路畅通一路畅通堵车!堵车!撞车!撞车!程序中的异常public class HelloAccp public static void main(String args)System.out.print(请输入课程代号请输入课程代号(1至至3之间的
3、数字之间的数字):);Scanner in=new Scanner(System.in);int courseCode=in.nextInt();/从键盘输入整数从键盘输入整数switch(courseCode)case 1:System.out.println(C#编程编程);break;case 2:System.out.println(Java编程编程);break;case 3:System.out.println(SQL基础基础);输入:输入:2输出:输出:Java编程编程输入:输入:B程序中断运行!程序中断运行!正常情况:正常情况:异常情况:异常情况:什么是异常异常就是在程序的运行
4、过程中所发生的不正常的事件,它会中断正在运行的程序绕行或者等待绕行或者等待请求交警解决请求交警解决异常!异常!面对异常该怎么办呢?通常情况下,我们会这样处理:面对异常该怎么办呢?通常情况下,我们会这样处理:程序运行程序运行程序中断运行程序中断运行堵车!堵车!撞车!撞车!生活中,我们会根据不同的异常进行相应的处理,生活中,我们会根据不同的异常进行相应的处理,而不会就此中断我们的生活而不会就此中断我们的生活什么是异常处理Java编程语言使用异常处理机制为程序提供了错误处理的能力程序中预先想好了程序中预先想好了 对付异常的处理办法对付异常的处理办法 异常!异常!程序运行程序运行处理完毕,程序继续运行
5、处理完毕,程序继续运行对异常进行处理对异常进行处理Throwable类所有错误或异常超类类Error严重的系统错误-由JVM处理系统崩溃虚拟机出错Exception类可以被捕获且可能恢复的异常情况-由程序处理受检异常-编译器要求必须处理的异常非受检异常-编译器不要求强制处理的异常,一般指逻辑异常。RunTimeException及其子类。受检异常没有找到具有指定名称的类异常:ClassNotFoundEception访问不存在的文件异常:FileNotfoundException操作文件时发生的异常:IOException操作数据库时发生的异常:SQLException非受检异常错误的类型转换
6、异常:ClassCastException数组下标越界异常:ArrayIndexOutofBoundsException空指针访问异常:NullPointerException除零溢出异常:ArithmeticExceptionJava中如何进行异常处理Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throws 捕获异常捕获异常 catchtryfinally执行可能产生执行可能产生 异常的代码异常的代码 捕获异常捕获异常 无论是否发生异常,无论是否发生异常,代码总能执行代码总能执行手动抛出异常手动抛出异常 抛出异常抛出异常 throw声明异常声明
7、异常 声明方法可能要声明方法可能要抛出的各种异常抛出的各种异常 throwstry/catch块7-1使用try/catch块捕获异常,分为三种情况:trycatch try/catch 块后的代码段块后的代码段public void method()try /代码段代码段(此处不会产生异常此处不会产生异常)catch(异常类型异常类型 ex)/对异常进行处理的代码段对异常进行处理的代码段/代码段代码段第一种情况第一种情况 try/catch块7-2使用示例模拟第一种情况:public class AccpException public static void main(String arg
8、s)System.out.print(请输入课程代号请输入课程代号(1至至3之间的数字之间的数字):);Scanner in=new Scanner(System.in);try int courseCode=in.nextInt();switch(courseCode)case 1:System.out.println(C#编程编程);break;case 2:System.out.println(Java编程编程);break;case 3:System.out.println(SQL基础基础);catch(Exception ex)System.out.println(输入不为数字输入不
9、为数字!);System.out.println(欢迎提出建议欢迎提出建议!);输入:输入:2Java编程编程欢迎提出建议欢迎提出建议!控制台输出控制台输出try/catch块7-3使用try/catch块捕获异常,分为三种情况:trycatch异常类型匹配异常类型匹配 try/catch 块后的代码段块后的代码段进入进入catch块块public void method()try /代码段代码段 1 /产生异常的代码段产生异常的代码段 2 /代码段代码段 3 catch(异常类型异常类型 ex)/对异常进行处理的代码段对异常进行处理的代码段4/代码段代码段5第二种情况第二种情况 产生异常对象
10、产生异常对象 程序继续执行程序继续执行异常是一种特殊的对象,异常是一种特殊的对象,类型为类型为java.lang.Exception或其子类或其子类 发生异常发生异常try/catch块7-4使用示例模拟第二种情况:public class AccpException public static void main(String args)System.out.print(请输入课程代号请输入课程代号(1至至3之间的数字之间的数字):);Scanner in=new Scanner(System.in);try int courseCode=in.nextInt();switch(course
11、Code)case 1:System.out.println(C#编程编程);break;case 2:System.out.println(Java编程编程);break;case 3:System.out.println(SQL基础基础);catch(Exception ex)System.out.println(输入不为数字输入不为数字!);ex.printStackTrace();System.out.println(欢迎提出建议欢迎提出建议!);输入:输入:B输入不为数字输入不为数字!异常堆栈信息异常堆栈信息欢迎提出建议欢迎提出建议!控制台输出控制台输出try/catch块7-5pr
12、intStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程 public class AccpException public static void main(String args)System.out.print(请输入课程代号请输入课程代号(1至至3之间的数字之间的数字):);Scanner in=new Scanner(System.in);try int courseCode=in.nextInt();/此处代码省略此处代码省略 catch(Exception ex)System.out.println(输入不为数字!输入不为数字!);ex.printStackTra
13、ce();System.out.println(欢迎提出建议欢迎提出建议!);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 s2jsp.sg.ch05.AccpException.main(AccpExce
14、ption.java:23)异常类型异常类型异常堆栈信息异常堆栈信息在此方法中抛出了异常在此方法中抛出了异常try/catch块7-6使用try/catch块捕获异常,分为三种情况:trycatch异常类型不匹配异常类型不匹配 try/catch 块后的代码段块后的代码段程序中断运行程序中断运行 发生异常发生异常public void method()try /代码段代码段 1 /产生异常的代码段产生异常的代码段 2 /代码段代码段 3 catch(异常类型异常类型 ex)/对异常进行处理的代码段对异常进行处理的代码段4/代码段代码段5第三种情况第三种情况 产生异常对象产生异常对象 try/c
15、atch块7-7使用示例模拟第三种情况:public class AccpException2 public static void main(String args)System.out.print(请输入课程代号请输入课程代号(1至至3之间的数字之间的数字):);Scanner in=new Scanner(System.in);try int courseCode=in.nextInt();switch(courseCode)case 1:System.out.println(C#编程编程);break;case 2:System.out.println(Java编程编程);break;
16、case 3:System.out.println(SQL基础基础);catch(NullPointerException ex)System.out.println(输入不为数字!输入不为数字!);System.out.println(欢迎提出建议!欢迎提出建议!);输入:输入:B程序中断运行程序中断运行try/catch/finally 2-1在try/catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行try 块块 finally 块块 catch 块块 无异常无异常 有异常有异常 try/catch/finally 2-2 public cl
17、ass AccpException3 public static void main(String args)System.out.print(请输入课程代号请输入课程代号(1至至3之间的数字之间的数字):);Scanner in=new Scanner(System.in);try int courseCode=in.nextInt();switch(courseCode)case 1:System.out.println(C#编程编程);break;case 2:System.out.println(Java编程编程);break;case 3:System.out.println(SQL
18、基础基础);catch(Exception ex)System.out.println(输入不为数字!输入不为数字!);finally System.out.println(欢迎提出建议!欢迎提出建议!);输入:输入:2Java编程编程欢迎提出建议欢迎提出建议!控制台输出控制台输出输入:输入:B输入不为数字输入不为数字!欢迎提出建议欢迎提出建议!第一种情况:第一种情况:无异常无异常第二种情况:第二种情况:有异常有异常 编写一个类ExceptionTest1,在main方法中使用try、catch、finally:在try块中,编写被0除的代码在catch块中,捕获被0除所产生的异常,并且打印异
19、常信息在finally块中,打印一条语句完整代码实现完整代码实现public void method()try /代码段代码段 /产生异常产生异常(异常类型异常类型2)catch(异常类型异常类型1 ex)/对异常进行处理的代码段对异常进行处理的代码段 catch(异常类型异常类型2 ex)/对异常进行处理的代码段对异常进行处理的代码段 catch(异常类型异常类型3 ex)/对异常进行处理的代码段对异常进行处理的代码段/代码段代码段多重catch块 2-1一段代码可能会引发多种类型的异常当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹配的catch语句执行其中的一
20、条 catch 语句之后,其后的 catch 语句将被忽略 try 与异常类型与异常类型1不匹配不匹配try/catch 块后的代码段块后的代码段发生异常发生异常产生异常对象产生异常对象catch与异常类型与异常类型2匹配匹配catchcatch程序继续执行程序继续执行进入进入catch块块多重catch块 2-2public class AccpException4 public static void main(String args)Scanner in=new Scanner(System.in);trySystem.out.print(“请输入请输入S1的总学时:的总学时:);int
21、 totalTime=in.nextInt();/总学时总学时System.out.print(“请输入请输入S1的课程数目:的课程数目:);int totalCourse=in.nextInt();/课程数目课程数目System.out.println(“S1各课程的平均学时为:各课程的平均学时为:+totalTime/totalCourse);catch(InputMismatchException e1)System.out.println(输入不为数字输入不为数字!);catch(ArithmeticException e2)System.out.println(课程数目不能为零课程数
22、目不能为零!);catch(Exception e)System.out.println(发生错误发生错误:+e.getMessage();输入:输入:270 H 在安排在安排catch语句的顺序时,首先应该捕获最特殊的异常,语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,即先子类后父类然后再逐渐一般化,即先子类后父类 输出:输出:输入不为数字输入不为数字!进入第一个进入第一个catch块块输入:输入:270 0 输出:输出:课程数目不能为零课程数目不能为零!进入第二个进入第二个catch块块抛出异常如果在当前环境无法解决一个异常,就要将其抛出,把异常交给调用者处理 public c
23、lass AccpTeacher private String id;/教员编号,长度应为教员编号,长度应为7 public void setId(String pId)/判断教员编号的长度是否为判断教员编号的长度是否为7 if(pId.length()=7)id=pId;else throw new IllegalArgumentException(参数长度应为参数长度应为7!);public class AccpTeacherTest public static void main(String args)AccpTeacher teacher=new AccpTeacher();try
24、teacher.setId(088);catch(IllegalArgumentException ex)System.out.println(ex.getMessage();抛出异常抛出异常捕获异常捕获异常参数长度应为参数长度应为7!控制台输出控制台输出声明异常public class AccpTeacher private String id;/教员编号教员编号,长度应为长度应为7 public void setId(String pId)throws IllegalArgumentException/判断教员编号的长度是否为判断教员编号的长度是否为7 if(pId.length()=7)
25、id=pId;else throw new IllegalArgumentException(参数长度应为参数长度应为7!);public class AccpTeacherTest public static void main(String args)AccpTeacher teacher=new AccpTeacher();try teacher.setId(088);catch(IllegalArgumentException ex)System.out.println(ex.getMessage();由调用者捕获异常由调用者捕获异常 声明该方法可能会产生异常声明该方法可能会产生异常
26、区别getMessage():返回此Throwable对象的详细消息字符串printStackTrace():将此Throwable对象及其追踪输出至标准错误流。例:int i=12/0;分别采用这两个方法输出信息。编写类ExceptionTest2:定义两个方法:go()和main()在go方法中声明要抛出异常,在该方法体内,抛出一个Exception对象在main()方法中,调用go方法,使用try/catch捕获go方法中抛出的异常完整代码实现完整代码实现 使用log4j记录日志信息public class AccpTeacherTest public static void main(
27、String args)AccpTeacher teacher=new AccpTeacher();try teacher.setId(088);catch(IllegalArgumentException ex)System.out.println(ex.getMessage();控制台输出控制台输出参数长度应为参数长度应为7!如果要在控制台与文件如果要在控制台与文件中同时输出错误信息,中同时输出错误信息,该如何处理?该如何处理?使用使用log4j可以解决这个问题,可以解决这个问题,log4j是一个流行的日志记录工具是一个流行的日志记录工具 这是使用这是使用log4j后,存储在文本文件中的日
28、志信息后,存储在文本文件中的日志信息 什么是日志日志:用来记录一些重要的操作信息有价值的日志数据能够帮助用户提前发现和避开灾难,并且找到事件发生的原因 public class AccpTeacherTest public static void main(String args)AccpTeacher teacher=new AccpTeacher();try teacher.setId(088);catch(IllegalArgumentException ex)System.out.println(ex.getMessage();在控制台输出日志信在控制台输出日志信息,提示用户出现错息,
29、提示用户出现错误的原因误的原因 如何使用log4j记录日志第一步:在工程中加入log4j所使用的jar文件项目项目 属性属性:弹出项目的属性窗口:弹出项目的属性窗口Java构建路径构建路径库库添加外部添加外部JAR:弹出选择:弹出选择JAR的窗口的窗口通过选择通过选择JAR的窗口,找到的窗口,找到log4j-1.2.x.jar,并确认,并确认回到项目的属性窗口,点击确定回到项目的属性窗口,点击确定1234演示:在工程中加入演示:在工程中加入log4j所使用的所使用的jar文件文件 如何使用log4j记录日志第二步:创建log4j.properties文件选择欲使用选择欲使用log4j的项目的项
30、目右键点击右键点击src 新建新建其他其他:弹出选择向导窗口:弹出选择向导窗口在选择向导窗口中,选择常规在选择向导窗口中,选择常规 文件文件 下一步:弹出新建文件的窗口下一步:弹出新建文件的窗口在新建文件窗口中,输入文件名在新建文件窗口中,输入文件名log4j.properties 完成:创建工作结束完成:创建工作结束123演示:创建演示:创建log4j.properties文件文件 如何使用log4j记录日志第三步:使用log4j记录日志信息import org.apache.log4j.Logger;public class AccpTeacherLog4j public static v
31、oid main(String args)AccpTeacher teacher=new AccpTeacher();Logger logger=Logger.getLogger(AccpTeacherLog4j.class.getName();try logger.debug(设置教员的编号。设置教员的编号。);teacher.setId(088);catch(IllegalArgumentException ex)logger.info(ex.getMessage();获取日志记录器,获取日志记录器,这个记录器将负责这个记录器将负责控制日志信息控制日志信息 使用使用Logger对象的对象的
32、debug、info方法输方法输出日志信息出日志信息 如何使用log4j记录日志第四步:编写log4j.properties文件,配置日志信息#把日志信息输出到控制台把日志信息输出到控制台#log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%dyyyy
33、-MM-dd HH:mm:ss%m%n#把日志信息输出到文件:把日志信息输出到文件:accp.log#log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=accp.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%dyyyy-MM-dd HH:mm:ss%l%m%n#设置优先级别、以及输出源设置优先级别、以及输出源#log4j.rootLo
34、gger=debug,stdout,file日志信息将写到文件中日志信息将写到文件中 指定日志输出的文件名指定日志输出的文件名 指定输出格式:指定输出格式:显示日期和显示日期和log信息信息 设置优先级别为设置优先级别为debug、日志被输出到多个输出源日志被输出到多个输出源 日志信息将写到控制台日志信息将写到控制台 信息打印到信息打印到System.out上上 指定输出格式:指定输出格式:显示日期,日志发生位置显示日期,日志发生位置和日志信息和日志信息 输出源名称输出源名称优先级从高到低分别是优先级从高到低分别是ERROR、WARN、INFO、DEBUG 在此处,如果优先级别设为在此处,如果
35、优先级别设为info,那么使用,那么使用debug方法打印的日志信息将不被输出方法打印的日志信息将不被输出 如何使用log4j记录日志运行效果展示控制台输出效果控制台输出效果包含日期与日包含日期与日志信息志信息文件输出效果文件输出效果包含日期、日志发生位置、与包含日期、日志发生位置、与日志信息日志信息12请给出下列Java代码的运行结果 public class Test public static void main(String args)new Test().test();public void test()try int arr=new int3;arr3=2;System.out.p
36、rintln(try);catch(ArrayIndexOutOfBoundsException e)System.out.println(catch 1);catch(Exception e)System.out.println(catch 2);finally System.out.println(finally);修改修改log4j.properties文件,设置优先级为文件,设置优先级为info,在,在控制台以及控制台以及accp.log文件中将会输出什么内容?文件中将会输出什么内容?控制台输出控制台输出catch 1finally将只输出使用将只输出使用Logger对象的对象的info方法输出的日志信息方法输出的日志信息 捕获异常捕获异常异常处理抛出异常总结不要丢弃异常,采用try-catch去捕获;Try中代码块尽量小;Catch中指明具体异常类型;在finally中释放资源,例关闭数据库。如果一个方法可能会发生异常,采用throws声明异常,并采用throw抛出异常。