资源描述
模块7异常处理学习目标了解异常产生的原因。了解Java异常体系结构,以及受检异常和未受检异常的区别。掌握使用try-catch-finally语句块捕捉并处理异常。掌握使用throw语句抛出异常,以及使用throws语句声明方法异常。掌握设计和使用用户自定义异常。技能目标能够在MyEclipse IDE中使用try-catch-finally语句块编写程序捕捉并处理 异常。01能够在MyEclipse IDE中使用throw语句编写程序抛出异常。02能够在MyEclipse IDE中使用throws语句编写程序声明方法异常。03能够在MyEclipse IDE中编写程序定义自己的异常。0407回顾与思考Java语言的健壮性确保了在编程过程中出现的错误可以得到及时、有效的控制。但是,并不是所有错误都能在编译阶段被发现。有些错误只有在运行时才会发生。在编译或运行时发生的错误都被称为异常。在编译或运行时跟踪这些异常被称为异 常处理。Java的异常处理机制负责异常处理和错误恢复。如果把【例6-1】中的代码/zfor(int i=l;i myArray.length;i+)/改成/zfor(int i=l;i=myArray.length;i+),z,这时,编译可以通过。运行后在控制 台出现如下提示。Exception in thread main java.Iang.ArraylndexOutOfBoundsException:8 at ch6.example.Example6_l.main(Example6_l.java:16)7.2异常与异常类7.2.1 Java异常体系结构Java中的异常有很多类型,包括在Java API中已经被定义的异常(也称系统异常)和用 户自定义异常。所有的异常类都直接或间接继承了Throwable类。Throwable类是。bject 类的直接子类。Th rowable类有两个直接子类:Exception类7.2异常与异常类7.2.2受检异常Exception类及其子类中除了RuntimeException类及其子类以外的异常被称为 受检异常(checked exception)o受检异常在 编译阶段能被Java编译器检测到,不可回避,用 户必须对受检异常进行处理。7.2异常与异常类7.2.2受检异常【例7】受检异常示例。文件名为Example7_l.java,其代码如下。package ch7.example;public class Example7_l/*例7-1受检异常示例*authorJava程序设计案例教程*version 1.0public static void main(String args)加载连接MySQL数据库的jdbc驱动Class.forNameCcom.mysql.jdbc.Driver);)*/7.2异常与异常类7.2.2受检异常【例7】受检异常示例。在/yClass.forName(com.mysql.jdbc.Dnver);/这条语句下出现了波浪线,光标停 留在该语句上会出现浮窗提示:未处理异常类型ClassNotFoundException,如图7-1所示OJQ Unhandled exception type ClassNotFoundException2 quick fixes available:Jg Add throws declarationJg Surround with try/catch图7-1受检异常未处理的浮窗提示7.2异常与异常类7.2.3未受检异常属于Runtime Exception类及其子类的异常和Error类及其 子类的异常被称为未受检异常(unchecked exception)o未 受检异常在编译阶段不能被Java编译器检测到。不强迫用户利用 异常处理机制对未受检异常进行处理。未受检异常的发生是因为 程序有逻辑错误。未受检异常首先且主要通过用户在程序编写过 程中避免。如果滥用异常处理机制处理(预防)未受检异常,程 序会变得臃肿,影响可读性。7.3异常处理结构7.3.1捕捉异常L try-catch语句块0可以使用try和catch语句块对程序中可能出现的异常进 行捕捉并处理。把可能产生异常的代码放置在try语句块内,catch语句块紧接着try语句块之后。catch语句块中包含了处 理异常及输出异常产生原因的语句。一个catch语句块仅对应一个try语句块,但是一个try语句块可以对应多个(多重)catch语句块。U*authorJava程序设计案例教程7.3异常处理结构7.3.1捕捉异常1.try-catch语句块【例72】try-catch语句块应用示例。文件名为Example7_2java,其代码如下。package ch7.example;import java.util.InputMismatchException;import java.util.Scanner;import ch5.example.Circle;*version 1.0*/public static void main(String0 args)Scanner sc=new Scanner(System,in);System.out.print(“请输入圆的半径:”);trydouble radius=sc.nextDouble();Circle c=new Circle(radius);System.out.println(圆的半径为:+catch(InputMismatchException ime)c.getRadius();ime.printStackTrace();public class Example7_2*例7-2 tr广catch语句块应用示例7.3异常处理结构7.3.1捕捉异常1.try-catch语句块【例72】try-catch语句块应用示例。程序运行后在控制台提示:请输入圆的半径:。如果用户不慎 输入了非数字字符,double radius=sc.nextDouble()这条语句就 会产生InputMismatchException异常。该异常在catch语句块中被捕捉。catch语句块中的printStackTrace()方法用于显示有关异常的信息,包含 产生异常的原因和产生异常的代码。7.3异常处理结构7.3.1捕捉异常 2.finally语句块finally语句块紧接着try-catch语句块之后,是一个可选项。每个try 语句块至少有一个对应的catch语句块或finally语句块。无论try catch 语句块内发生什么,如果产生了异常,即便没有catch语句块与产生的异 常匹配,finally语句块也将执行。因此,在finally语句块中可以安排一 些将系统资源清理释放或输出消息的语句,如关闭文件、关闭数据库连 接等。7.3异常处理结构7.3.1捕捉异常 2.finally语句块【例73】try-catch-finally语句块应用示例。文件名为Example7_3.java,其代码如下。程序运行后在控制台提示:请输 入圆的半径:。如果用户输入了正常 的数字,那么运行结果如下。其代码见P146-147。请输入圆的半径:2 圆的半径为:2.0 程序正常运行,即将关闭扫描器。7.3异常处理结构7.3.1捕捉异常 2.finally语句块【例73】try-catch-finally语句块应用示例。如果用户输入了非数字字符,那么运行结果如下。请输入圆的半径:a程序正常运行,即将关闭扫描器。java,util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner,java:840)at java.util.Scanner,next(Scanner,java:1461)at java.util.Scanner.nextDouble(Scanner,java:2387)at ch7.example.Example7_3.main(Example7_3.jaua:19)7.3异常处理结构7.3.1捕捉异常3.多重catch语句块如果一段程序会产生多个异常,必须使用多重catch语 句块分别捕捉每个异常。按照异常出现的顺序来查看每个 catch语句块,并执行与异常匹配的第一个语句块,其他 catch语句块将被忽略,程序控制流程转到try catch语句 块后面的语句。编写每个catch语句块时要尽量具体,以便 尽可能多地获得所产生异常的报告。7.3异常处理结构7.3.1捕捉异常3.多重catch语句块【例74】多重catch语句块应用示例。文件名为Example7_4.java,其代码如下。package ch7.example;public class Example7_4/*例7-4多重catch语句块应用示例*authorJava程序设计案例教程*vers ion 1.0*/tryString str args0;int num=Integer.parselnt(str);catch(ArrayIndexOutOfBoundsException aioobe)System.out.printin(未给出参数!”);catch(NumberFormatException nfe)System.out.printin(不是一个数字!);public static void main(String口 args)7.3异常处理结构7.3.1捕捉异常3.多重catch语句块【例74】多重catch语句块应用示例。如果运行配置未输入参数,控制权转到第一个catch语句块,运行结果如下。未给出参数!如果运行配置输入了非数字参数,控制权转到第二个catch语句块,运行结果如下。不是一个数字!7.3异常处理结构7.3.1捕捉异常3.多重catch语句块007-5多重catch语句块排列顺序示例。文件名为Example7_5.java,其代码如下。package ch7.example;public class Example7_5/*例7-5多重catch语句块排列顺序示例*authorJava程序设计案例教程*version 1.0*/public static void main(String args)try(double d=10/0;catch(ArithmeticException ae)ae.printStackTrace();catch(RuntimeException re)re.printStackTrace();catch(Except ion e)e.printStackTrace();7.3异常处理结构7.3.1捕捉异常3.多重catch语句块007-5多重catch语句块排列顺序示例。如果把第三个catch语句块和第一个catch语句块互换,则会出现浮窗提示:不可达到的 子类catch语句块。编译不能通过,如图7-2所示。图7-2不可达到的子类catch语句块7.3异常处理结构7.3.2 抛出异常在程序中可以用throw语句引发明确的异常,执行流程在throw语句后立即停止,给用 户以提示。throw语句的基本语法格式如下。throw异常类实例;其中,异常类实例指Throwable类或其子类的实例。7.3异常处理结构7.3.3 声明异常一个方法(包括构造方法、成员方法)被调用执行时可以引发多个异常。定义这样的方 法必须加上关键字th rows声明异常。th rows语句的基本语法格式如下。方法名(形式参数列表)throws异常类1,异常类2,if(异常条件1成立)throw new 异常类 1();if(异常条件2成立)throw new 异常类 2();7.3异常处理结构7.3.3声明异常【例76】声明并抛出异常示例。文件名为Example7_6.java,其代码如下。口当用户分别输入数字1和2时,分 别抛出ArraylndexOutOfBoundsException 异常和 IllegalAccessException 异常。其代码见P150-15L7.4自定义异常Java API提供的异常类型并不总能满足所有异常捕捉的需求,用户可以定义自己的异常。用户自定义异常必须是Throwable类的直接或间接子类。通常用户自定义异常直接继承Exception类。创建自定义异常的目的是为代码可能发生的错误类型提供新的含义。74自定义异常【例77】自定义异常示例。首先定义用户异常,文件名为MyException.java,其代码如下。package ch7.example;public class MyException extends Exception/*例7-7自定义异常示例*authorJava程序设计案例教程*version 1.0*/MyException(String errorMsg)super(errorWsg);74自定义异常【例77】自定义异常示例。然后,重新定义模块5中Circle类的构造方法Circle(double radius)和成员方法 setRadius(double radius)方法。完整的Circle类代码如下。_其代码见P152-153。最后,编写测试类。文件名为Example7_7.java,其代 码如下。_立_其代码见P153-154。Java的异常处理机制保证了程序的运行不受异常干扰而正 常进行。Java中的异常类型包括系统异常和用户自定义异常。系统异常根据能否通过编译分为受检异常和未受检异常。Java 使用try catch finally语句块捕捉并处理异常,使用th row语 句抛出异常,使用throws语句声明方法异常。用户可以根据需 要定义自己的异常。用户自定义异常必须直接或间接继承 Exception 类。7.6习题1.f i n a I ly语句块能位于ca tc h语句块之前 吗?找个例子改一改,看看上机能否通过。2.简述异常的分类及各自的处理方法。3.下列代码片段运行有问题吗?上机试 一试。trySystem.out.printin(传递的参数是:+args0);tryint numValue=Integer.parseInt(argsO);System.out.println(argsO+”的 平方 是:+Math.pow(numValue,2);catch(NumberFormatException nfe)System.out.print In(不是一个数字!);catch(ArrayIndexOutOfBoundsException aioobe)System.out.println(请输入参数!”);4.修改模块4的习题4,如果三角形的3条边长不满足构成 三角形的条件,则引发异常。7.7上机实践1.定义一个数组,其长度由Math.random。方法决定,如 果为0,则引发异常并进行捕捉。2.修改模块4上机实践2,如果一元二次方程没有实数解,则引发异常并进行处理。3.编程接收用户输入的手机号码,如果出现不是以数字 1开头,长度不是11位,号码中出现非数字等情况,将引 发异常并进行处理。4.编程接收用户输入的成绩,如果输入的成绩小于0或大 于100,则提示异常信息请输入正确的成绩。创建自定义 异常满足上述要求。谢谢观看!
展开阅读全文