《Java中的异常处理PPT课件》由会员分享,可在线阅读,更多相关《Java中的异常处理PPT课件(23页珍藏版)》请在金锄头文库上搜索。
1、使用异常处理程序错误使用异常处理程序错误使用异常处理程序错误使用异常处理程序错误第四章第四章第四章第四章1掌握掌握Java的异常处理机制的异常处理机制运用运用 try 、catch 、 finally 处理异常处理异常运用运用 throw 抛出异常抛出异常运用运用 throws 声明异常声明异常本章目标本章目标2生活中的异常生活中的异常正常情况下,小王每日开车去上班,耗时大约正常情况下,小王每日开车去上班,耗时大约30分钟分钟但是,异常情况迟早要发生!但是,异常情况迟早要发生!一路畅通一路畅通堵车!堵车!撞车!撞车!3程序中的异常程序中的异常public class HelloAccp pub
2、lic static void main(String args) (请输入课程代号请输入课程代号(1至至3之间的数字之间的数字):);Scanner in = new );int courseCode = (); / 从键盘输入整数从键盘输入整数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程序中断运行!程
3、序中断运行!正常情况:正常情况:异常情况:异常情况:4什么是异常什么是异常异常就是在程序的运行过程中所发生的不正常的事件,它异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序会中断正在运行的程序绕行或者等待绕行或者等待请求交警解决请求交警解决异常!异常!面对异常该怎么办呢?通常情况下,我们会这样处理:面对异常该怎么办呢?通常情况下,我们会这样处理:程序运行程序运行程序中断运行程序中断运行堵车!堵车!撞车!撞车!生活中,我们会根据不同的异常进行相应的处理,生活中,我们会根据不同的异常进行相应的处理,而不会就此中断我们的生活而不会就此中断我们的生活5什么是异常处理什么是异常处理
4、Java编程语言使用异常处理机制为程序提供了错误处理的编程语言使用异常处理机制为程序提供了错误处理的能力能力程序中预先想好了程序中预先想好了 对付异常的处理办法对付异常的处理办法 异常!异常! 程序运行程序运行处理完毕,程序继续运行处理完毕,程序继续运行对异常进行处理对异常进行处理6Java中如何进行异常处理中如何进行异常处理Java的异常处理是通过的异常处理是通过5个关键字来实现的:个关键字来实现的:try、catch、 finally、throw、throws 捕获异常捕获异常 catchtryfinally执行可能产生执行可能产生 异常的代码异常的代码 捕获异常捕获异常 无论是否发生异常
5、,无论是否发生异常,代码总能执行代码总能执行手动抛出异常手动抛出异常 抛出异常抛出异常 throw声明异常声明异常 声明方法可能要声明方法可能要抛出的各种异常抛出的各种异常 throws7try/catch块块7-1trycatch try/catch 块后的代码段块后的代码段public void method()try / 代码段代码段(此处不会产生异常此处不会产生异常) catch (异常类型异常类型 ex) / 对异常进行处理的代码段对异常进行处理的代码段/ 代码段代码段使用使用try/catch块捕获异常,分为三种情况:块捕获异常,分为三种情况:第一种情况第一种情况 8try/cat
6、ch块块7-2使用示例模拟第一种情况:使用示例模拟第一种情况:public class AccpException public static void main(String args) (请输入课程代号请输入课程代号(1至至3之间的数字之间的数字):);Scanner in = new );try int courseCode = ();switch (courseCode) case 1: System.out.println(C#编程编程); break;case 2: System.out.println(Java编程编程); break;case 3: System.out.pri
7、ntln(SQL基础基础); catch (Exception ex) (输入不为数字输入不为数字!);(欢迎提出建议欢迎提出建议!);输入:输入:2Java编程编程欢迎提出建议欢迎提出建议!控制台输出控制台输出9try/catch块块7-3trycatch异常类型匹配异常类型匹配 try/catch 块后的代码段块后的代码段进入进入catch块块public void method()try / 代码段代码段 1 / 产生异常的代码段产生异常的代码段 2 / 代码段代码段 3 catch (异常类型异常类型 ex) / 对异常进行处理的代码段对异常进行处理的代码段4/ 代码段代码段5使用使用
8、try/catch块捕获异常,分为三种情况:块捕获异常,分为三种情况:第二种情况第二种情况 产生异常对象产生异常对象 程序继续执行程序继续执行异常是一种特殊的对象,异常是一种特殊的对象, 发生异常发生异常10try/catch块块7-4使用示例模拟第二种情况:使用示例模拟第二种情况:public class AccpException public static void main(String args) (请输入课程代号请输入课程代号(1至至3之间的数字之间的数字):);Scanner in = new );try int courseCode = ();switch (courseCod
9、e) case 1:System.out.println(C#编程编程);break;case 2:System.out.println(Java编程编程);break;case 3:System.out.println(SQL基础基础); catch (Exception ex) (输入不为数字输入不为数字!); ();(欢迎提出建议欢迎提出建议!);输入:输入:B输入不为数字输入不为数字!异常堆栈信息异常堆栈信息欢迎提出建议欢迎提出建议!控制台输出控制台输出11printStackTrace的堆栈跟踪功能显示出程序运行到当前的堆栈跟踪功能显示出程序运行到当前类的执行流程类的执行流程 pub
10、lic class AccpException public static void main(String args) (请输入课程代号请输入课程代号(1至至3之间的数字之间的数字):); Scanner in = new ); try int courseCode = (); /此处代码省略此处代码省略 catch (Exception ex) (输入不为数字!输入不为数字!); (); (欢迎提出建议欢迎提出建议!); try/catch块块7-5java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.j
11、ava: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(AccpException.java:23)异常类型异常类型异常堆栈信息异常堆栈信息在此方法中抛出了异常在此方法中抛出了异常12try/catch块块7-6trycatch异常类型不匹配异常类型不匹配 try/catch 块后的代码段块
12、后的代码段程序中断运行程序中断运行 发生异常发生异常public void method()try / 代码段代码段 1 / 产生异常的代码段产生异常的代码段 2 / 代码段代码段 3 catch (异常类型异常类型 ex) / 对异常进行处理的代码段对异常进行处理的代码段4/ 代码段代码段5使用使用try/catch块捕获异常,分为三种情况:块捕获异常,分为三种情况:第三种情况第三种情况 产生异常对象产生异常对象 13try/catch块块7-7使用示例模拟第三种情况:使用示例模拟第三种情况:public class AccpException2 public static void mai
13、n(String args) (请输入课程代号请输入课程代号(1至至3之间的数字之间的数字):);Scanner in = new );try int courseCode = ();switch (courseCode) case 1: System.out.println(C#编程编程); break;case 2: System.out.println(Java编程编程); break;case 3: System.out.println(SQL基础基础); catch (NullPointerException ex) (输入不为数字!输入不为数字!);(欢迎提出建议!欢迎提出建议!)
14、;输入:输入:B程序中断运行程序中断运行14try/catch/finally 2-1在在try/catch块后加入块后加入finally块,可以确保无论是否发生异块,可以确保无论是否发生异常,常,finally块中的代码总能被执行块中的代码总能被执行try 块块 finally 块块 catch 块块 无异常无异常 有异常有异常 15try/catch/finally 2-2 public class AccpException3 public static void main(String args) (请输入课程代号请输入课程代号(1至至3之间的数字之间的数字):);Scanner in
15、 = new );try int courseCode = ();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) (输入不为数字!输入不为数字!); finally (欢迎提出建议!欢迎提出建议!);输入:输入:2Java编程编程欢迎提出建议欢迎提出建议!控制台输出控制台输出输入:输入:B输入不为数字输入不为数字!欢迎
16、提出建议欢迎提出建议!第一种情况:第一种情况:无异常无异常第二种情况:第二种情况:有异常有异常 16小结小结 1编写一个类编写一个类ExceptionTest1,在,在main方法中使用方法中使用try、catch、finally:在在try块中,编写被块中,编写被0除的代码除的代码在在catch块中,捕获被块中,捕获被0除所产生的异常,并且打印异常信息除所产生的异常,并且打印异常信息在在finally块中,打印一条语句块中,打印一条语句完整代码实现完整代码实现17public void method()try / 代码段代码段 / 产生异常产生异常(异常类型异常类型2) catch (异常类
17、型异常类型1 ex) / 对异常进行处理的代码段对异常进行处理的代码段 catch (异常类型异常类型2 ex) / 对异常进行处理的代码段对异常进行处理的代码段 catch (异常类型异常类型3 ex) / 对异常进行处理的代码段对异常进行处理的代码段/ 代码段代码段多重多重catch块块 2-1一段代码可能会引发多种类型的异常一段代码可能会引发多种类型的异常当引发异常时,会按顺序来查看每个当引发异常时,会按顺序来查看每个 catch 语句,并执行语句,并执行第一个与异常类型匹配的第一个与异常类型匹配的catch语句语句执行其中的一条执行其中的一条 catch 语句之后,其后的语句之后,其后
18、的 catch 语句将语句将被忽略被忽略 try 与异常类型与异常类型1不匹配不匹配try/catch 块后的代码段块后的代码段发生异常发生异常产生异常对象产生异常对象catch与异常类型与异常类型2匹配匹配catchcatch程序继续执行程序继续执行进入进入catch块块18多重多重catch块块 2-2public class AccpException4 public static void main(String args) Scanner in = new );try(“请输入请输入S1的总学时:的总学时:);int totalTime = (); /总学时总学时(“请输入请输入S1
19、的课程数目:的课程数目:);int totalCourse = (); /课程数目课程数目System.out.println(“S1各课程的平均学时为:各课程的平均学时为: + totalTime / totalCourse); catch (InputMismatchException e1) (输入不为数字输入不为数字!); catch (ArithmeticException e2) (课程数目不能为零课程数目不能为零!); catch (Exception e) (发生错误发生错误:+();输入:输入:270 H 在安排在安排catch语句的顺序时,首先应该捕获最特殊的异常,语句的顺
20、序时,首先应该捕获最特殊的异常, 然后再逐渐一般化,即先子类后父类然后再逐渐一般化,即先子类后父类 输出:输出:输入不为数字输入不为数字!进入第一个进入第一个catch块块输入:输入:270 0 输出:输出:课程数目不能为零课程数目不能为零!进入第二个进入第二个catch块块19抛出异常抛出异常如果在当前环境无法解决一个异常,就要将其抛出,把异如果在当前环境无法解决一个异常,就要将其抛出,把异常交给调用者处理常交给调用者处理 public class AccpTeacher private String id; / 教员编号,长度应为教员编号,长度应为7 public void setId(S
21、tring pId) / 判断教员编号的长度是否为判断教员编号的长度是否为7 if () = 7) 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) (); 抛出异常抛出异常捕获异常
22、捕获异常参数长度应为参数长度应为7!控制台输出控制台输出20声明异常声明异常public class AccpTeacher private String id;/ 教员编号教员编号,长度应为长度应为7 public void setId(String pId) throws IllegalArgumentException / 判断教员编号的长度是否为判断教员编号的长度是否为7 if () = 7) id = pId; else throw new IllegalArgumentException(参数长度应为参数长度应为7!); public class AccpTeacherTest p
23、ublic static void main(String args) AccpTeacher teacher = new AccpTeacher();try teacher.setId(088); catch (IllegalArgumentException ex) (); 由调用者捕获异常由调用者捕获异常 声明该方法可能会产生异常声明该方法可能会产生异常 21小结小结 2编写类编写类ExceptionTest2:定义两个方法:定义两个方法:go()和和main() 在在go方法中声明要抛出异常,在该方法体内,抛出一个方法中声明要抛出异常,在该方法体内,抛出一个Exception对象对象在
24、在main()方法中,调用方法中,调用go方法,使用方法,使用try/catch捕获捕获go方法方法中抛出的异常中抛出的异常完整代码实现完整代码实现22总结总结请给出下列请给出下列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.println(try); catch (ArrayIndexOutOfBoundsException e) System.out.println(catch 1); catch (Exception e) System.out.println(catch 2); finally System.out.println(finally);修改文件,设置优先级为修改文件,设置优先级为info,在控制台以及文件中,在控制台以及文件中将会输出什么内容?将会输出什么内容?控制台输出控制台输出catch 1finally将只输出使用将只输出使用Logger对象的对象的info方法输出的日志信息方法输出的日志信息 23