




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第九章第九章 Java异常处理异常处理 第九章第九章 Java异常处理异常处理技能目标:技能目标: 通过本章学习,了解异常处理的目的,了解异常类和异常处理机制,掌握什么情况会引发异常,以及异常发生时怎样进行处理,最终能把本章知识与实际应用结合开发应用程序。知识目标:知识目标: 理解异常的基本概念; 掌握异常类的层次关系; 了解异常处理机制; 掌握捕获并处理异常的常用方法; 掌握自定义异常的方法。任务:完善教务管理系统,根据课程代码输出课程名称,输任务:完善教务管理系统,根据课程代码输出课程名称,输出各学期平均课时等信息出各学期平均课时等信息9.1异常处理概述 Java语言中采用了异常处理机制,
2、使得程序可将错误处理的控制流从正常进行的控制流中分离开,使我们不用再检查一个特定的错误,并在程序的多处地方对其进行控制。此外,也不需要在方法调用的时候检查错误,而只需要在异常控制语句处理错误。并且Java采用异常处理机制后,使得程序更加稳定、健壮。9.1.1异常基本概念 所谓异常,就是程序在运行过程中出现的错误、非正常终止等非正常情况。产生异常的原因很多,如:系统资源耗尽、数组下标越界、被除数为零、空指针访问、试图读取的文件不存在、网络连接中断等。Java中提供的异常处理是用来解决程序中当某种非正常情况发生时如何处理的一种机制。 Java把程序运行过程中可能遇到的错误分为两类,一类是非致命性的
3、,通过有效的处理后,程序还能继续执行,这类错误称作异常,如打开一个文件时,发现文件不存在,或操作数超出数据范围;另一类是致命性的,即程序遇到了导致程序无法运行的问题,而且程序本身不能处理,只能依靠外界干预,否则一直处于非正常状态,不能简单地恢复执行,这就是错误,比如程序运行过程中内存溢出、虚拟机错误等。 9.1.1异常基本概念 在Java语言包中,提供了许多处理错误和异常的类,主要分为两大部分:错误类Error和异常类Exception。 Error错误类,定义了被认为是不可恢复的严重错误条件。这样的错误超出了程序的可控范围,大多数与程序本身的操作无关。在大多数情况下,当遇到这样的错误时,建议
4、让该程序中断运行。 Exception异常类,定义了程序中可能遇到的轻微的错误条件,是可预测并可恢复的问题,可以通过编写代码来处理并继续执行程序。9.1.1异常基本概念例9-1 除数为0产生算术运算异常。public class Division public static void main(String args) int i=2,j=0,div; div=i/j; System.out.println(i+/+j+=+div); 程序运行结果: Exception in thread main java.lang.ArithmeticException: / by zero at Div
5、ision.main(Division.java:11)程序说明:从本程序的运行结果来看,程序产生了ArithmeticException,是由除数为0导致的。由于程序没有处理除数为0的异常,程序只运行到异常发生的语句“div=i/j;”,系统提示异常信息后,终止了程序运行。9.1.1异常基本概念例9-2 产生数组下标越界异常。public class ArrayOutOfBounds public static void main (String args) int a = 1,2,3,4,5; for(int i=0;i6;i+) System.out.println( a+i+=+ai)
6、; 9.1.1异常基本概念程序运行结果:a0=1 a1=2 a2=3 a3=4 a4=5Exception in thread main java.lang.ArrayIndexOutOfBoundsException: 5 at Division.main(Division.java:13)程序说明:程序运行时,循环的前5次正常输出了5个数,但第6次进入循环并试图输出a5时,程序提示出现异常ArrayIndexOutOfBoundsException,原因是下标5越界,发生异常的位置是语句“System.out.println( a+i+=+ai);”,然后中止了程序的运行。对于上述异常情况
7、,程序可以预先采取有效的处理方法,而不是等待系统报错,导致程序无法正常终止。 9.1.2异常处理机制 Java语言是面向对象的语言,它对于异常的处理采用的是面向对象的思想。它将各种异常划分为若干个异常类。如果程序在执行过程中出现了异常,就会生成一个异常对象。这个对象有可能由正运行的方法生成,也可能由Java虚拟机生成,其中包含一些信息指时异常事件的类型以及当异常发生时程序的运行状态等。 程序运行所导致的异常发生后,由Java语言提供的异常处理机制处理。Java的异常处理机制包括异常类体系、异常处理的try语句、抛出自定义异常对象的throw语句、声明方法抛出异常的throws语句。这些功能使得
8、程序不仅能够捕获并处理异常,还能够主动抛出异常,也能够将异常向调用传递。 9.1.2异常处理机制Java主要提供两种处理异常的机制:(1)捕获异常。在Java程序执行过程中如果出现了异常事件,就会生成一个Exception类的异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛出异常。当Java运行时系统得到一个异常对象时,它将会寻找处理这一异常的代码。找到能够处理这种类型的异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。这是积极的异常处理机制。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应
9、地Java程序也将退出。(2)抛出异常。当Java程序运行时系统得到一个异常对象时,如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛出(throws)异常。这是一种消极的异常处理机制。9.2异常类9.2.1 异常类的层次和主要子类在Java语言中,任何异常对象都是java.lang.Throwable类或其子类的对象。Throwable类是Java异常类体系中的根类,它有两个子类:一个是Error类,另一个是Exception类。Error类是程序员没有办法处理的Java内部的错误,而Exception类是我们真正关心并尽可能加以处理的。 9.2.1 异常类的层次和主要子类
10、Java异常处理的层次结构如图所示。 9.2.1 异常类的层次和主要子类 在Exception的子类中,RuntimeException类又有许多子类,这种异常是在程序运行过程中产生的异常,如ArithmeticException就是RuntimeException的子类,如图所示。9.2.1 异常类的层次和主要子类 根据Java编译器是否检查异常处理情况,可将Exception类分为运行时异常(RuntimeException)和非运行时异常。9.2.1 异常类的层次和主要子类1. 运行时异常运行时异常是指由程序本身错误引发的异常,这类异常程序设计时大多可以避免。运行时的异常类就是Runti
11、meException及其子类。常用的运行时异常类有:(1)ArithmeticException:算术运算异常。当进行整数除法或取余运算时,如果除数为0,则产生ArithmeticException异常。(2)ArrayIndexOutOfBoundsException:数组下标越界异常。当访问数组元素时,如果下标越界,则产生ArrayIndexOutOfBoundsException异常。(3)NullPointerException:空指针异常。当一个数组变量赋值为空引用(null)时,如果对该数组中的元素进行操作,则产生NullPointerException。9.2.1 异常类的层次
12、和主要子类2. 非运行时异常非运行时异常是指由程序运行环境错误引发的异常,这类异常必须捕获并处理,这类异常是指RuntimeException以外的异常。常用的非运行时异常类有:(1)ClassNotFoundException:找不到类或接口时所产生的异常。(2) IOException:当发生某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作生成的异常的通用类。(3)InterruptedException:当前线程等待执行,另一线程中断当前线程所产生的异常。(4)FileNotFoundException:在文件系统中没有找到由文件名字符串指定的文件时产生的异常。9.2.
13、2 异常类的构造函数和方法1.Exception类的构造函数(1)public Exception():构造一个没有详细信息的新异常。(2)public Exception(String message):构造带指定详细消息的新异常。当异常被捕获时,可以从信息当中得知异常发生的原因。(3)public Exception(String message,Throwable cause):构造带指定详细信息和原因的新异常。(4)public Exception(Throwable cause):根据指定的原因和 (cause=null ? null : cause.toString() 的详细消息
14、构造新异常(它通常包含 cause 的类和详细消息)。9.2.2 异常类的构造函数和方法2.Exception类的常用方法(1)public String getMessage():返回描述异常对象的详细消息的字符串,该字符串是在构造方法中指定的参数。(2)public void printStackTrace(PrintStream s):将此异常对象的堆栈使用轨迹输出到指定的输出流。 (3)public String toString():返回描述异常类信息的字符串。9.3 Java异常的处理方法 如果在程序运行过程中出现异常,系统首先创建异常对象并交给运行时系统,再由系统寻找代码处理异常
15、,共经历抛出异常、捕获异常和处理异常几个过程。 Java异常处理通过5个关键字来实现:try、catch、throw、throws、finally。9.3.1 try-catch-finally语句 Java的异常处理机制使用trycatchfinally块处理异常。把可能发生异常的程序代码放在try区块中,当程序运行发生异常时,catch区块会捕获这个异常,并且以区块内的程序代码来处理异常。finally区块负责处理一些必要的工作,并且无论try区块内的程序代码是否发生异常,finally区块内的程序代码都会被执行。9.3.1 try-catch-finally语句1.try-catchJa
16、va使用try-catch-finally语句处理异常,其中核心部分是try-catch。try和catch这两个关键字必须同时使用,catch语句紧跟在try语句的后面。使用try-catch语句处理异常的格式为:try 可能产生异常的代码块catch(异常类 异常对象) 异常处理代码块9.3.1 try-catch-finally语句 try后面的内是可能出现异常的代码段,catch后面的内是相应的异常处理代码段。catch中的异常类必须与try抛出的异常对象匹配,才能捕获异常。这种匹配包括两种情况:第一种情况,catch中的异常类就是try抛出的异常对象对应的异常类;第二种情况,由于父类
17、对象可以引用子类对象,catch中的异常类也可以是抛出的异常对象的父类,即父类的catch语句能捕获子类的异常。如果catch中的异常类与抛出的异常对象不匹配,catch语句就不能捕获异常,最终异常将被虚拟机捕获。 9.3.1 try-catch-finally语句try-catch语句的执行流程有下列三种可能出现的情况:(1)如果try中没有出现异常,try代码块执行结束后,然后跳过catch语句,执行try-catch后面的语句。(2)如果try监视的可能产生异常的代码块出现异常并被catch捕获时,程序将跳过try中的其余语句,转去执行catch中的代码块。(3)如果try监视的可能产生
18、异常的代码块出现异常但没有被catch捕获时,程序将终止执行,由虚拟机捕获并处理异常。9.3.1 try-catch-finally语句 例9-3 使用try-catch语句处理除数为0产生的算术运算异常。9.3.1 try-catch-finally语句public class Division public static void main (String args) int i=2,j=0,div; try div=i/j; System.out.println(i+/+j+=+div); catch(ArithmeticException e) System.out.println(捕
19、获到算术运算异常); 程序运行结果: 捕获到算术运算异常程序说明:在本程序中,try语句块中的“div=i/j;”出现异常并被catch捕获,程序将跳过try中其余的语句,转去执行catch中的异常处理语句,输出“捕获到算术运算异常”。9.3.1 try-catch-finally语句例9-4 使用try-catch语句处理数组下标越界异常。public class ArrayOutOfBounds public static void main (String args) int a = 1,2,3,4,5; try for(int i=0;i6;i+) System.out.println
20、( a+i+=+ai); catch(ArrayIndexOutOfBoundsException e) System.out.println(捕获到数组下标越界异常); 9.3.1 try-catch-finally语句程序运行结果: a0=1 a1=2 a2=3 a3=4 a4=5捕获到数组下标越界异常程序说明:程序运行时,循环的前5次正常输出了5个数,但第6次进入循环并试图输出a5时,程序出现异常ArrayIndexOutOfBoundsException,这时catch捕获异常,程序转去执行catch中的异常处理代码,输出“捕获到数组下标越界异常”。 9.3.1 try-catch-f
21、inally语句例9-5 根据输入的课程代码输出相应的课程名称,并使用try-catch语句处理输入不匹配异常。import java.util.*;public class InputMismatchpublic static void main(String args) System.out.print(请输入课程代号(13):);Scanner sc = new Scanner(System.in);try int courseCode = sc.nextInt();switch (courseCode) case 1:System.out.println(English);break;
22、case 2:System.out.println(Java);break;9.3.1 try-catch-finally语句case 3:System.out.println(DB);break;default:System.out.println(您输入的数字超出了范围!); catch (Exception e) System.out.println(输入不为数字!);e.printStackTrace();System.out.println(谢谢使用!);9.3.1 try-catch-finally语句程序运行结果: 请输入课程代号(13):i输入不为数字!java.util.In
23、putMismatchException at java.util.Scanner.throwFor(Scanner.java:909) at java.util.Scanner.next(Scanner.java:1530) at java.util.Scanner.nextInt(Scanner.java:2160) at java.util.Scanner.nextInt(Scanner.java:2119) at s2Java.sg.ch04.AccpException.main(AccpException.java:14)谢谢使用!程序说明:程序在运行时,如果输入13之间的数,会输出
24、相应的课程名称;如果输入范围外的数字,会输出“您输入的数字超出了范围!”;如果输入非数字,就会产生异常InputMismatchException,catch捕获到异常,执行相应的异常处理代码,输出“输入不为数字!”,并执行“e.printStackTrace();”打印输出异常的堆栈信息。9.3.1 try-catch-finally语句2.使用多重catch语句Java异常处理时,catch语句可以有多个,用来匹配多个异常。匹配上多个中的一个后,执行catch语句块时仅仅执行匹配上的异常。其形式如下所示:try 可能产生异常的代码块catch(异常类1 异常对象1) 异常处理代码块1cat
25、ch(异常类2 异常对象2) 异常处理代码块2catch(异常类n 异常对象n) 异常处理代码块n说明:在多重catch语句中,每一个catch语句捕获的异常必须是不同类型。9.3.1 try-catch-finally语句例9-6 捕获两种不同类型的异常。public class TwoException public static void main (String args) int a = 1,2,3,4,5; for(int i=0;i6;i+) try System.out.println(a+i+/+i+=+(ai/i); catch(ArrayIndexOutOfBoundsE
26、xception e) System.out.println(捕获数组下标越界异常!); catch(ArithmeticException e) System.out.println(捕获算术异常!); 9.3.1 try-catch-finally语句程序运行结果: 捕获算术异常!a1/1=2a2/2=1a3/3=1a4/4=1捕获数组下标越界异常!程序说明:在本程序中,i=0时出现算术运算异常,第二个catch语句捕获异常并执行相应的异常处理语句输出“捕获算术异常!”,当i=5时出现数组下标越界异常,第一个catch语句捕获异常并执行相应的异常处理语句输出“捕获数组下标越界异常!”。9.
27、3.1 try-catch-finally语句例9-7 根据输入的总学时和课程数目求学期平均学时,并对可能出现的异常进行处理。public class AvgTimepublic static void main(String args) Scanner sc = new Scanner(System.in);trySystem.out.print(请输入第一学期的总学时:);int totalTime = sc.nextInt(); System.out.print(请输入第一学期的课程数目:);int totalCourse = sc.nextInt(); System.out.print
28、ln(第一学期各课程的平均学时为: + totalTime / totalCourse); catch (InputMismatchException e1) System.out.println(输入不为数字!); catch (ArithmeticException e2)System.out.println(课程数目不能为零!);9.3.1 try-catch-finally语句程序运行结果: 请输入第一学期的总学时:3oo输入不为数字!程序说明:在本程序中,当输入不为数字时出现InputMismatchException异常,由第一个catch捕获,输出“输入不为数字!”;当输入的课程
29、数目为0时,产生ArithmeticException异常,由第二个catch捕获,输出“课程数目不能为零!”。9.3.1 try-catch-finally语句 3.finally关键字的使用 有的程序中,无论是否产生异常都需要执行某些代码。如,抛出异常前如果建立了一个网络连接,无论是否抛出异常,都应该关闭连接。为了在退出try-catch代码块时设定一段必须要执行的代码,在try-catch代码块的后面引入了一个finally块。 9.3.1 try-catch-finally语句try-catch-finally的基本形式如下:try可能产生异常的语句块catch(异常类1异常对象1)异
30、常处理语句块1catch(异常类2异常对象2)异常处理语句块2finally无条件执行语句块9.3.1 try-catch-finally语句try-catch-finally异常处理语句的执行流程有下列三种可能出现的情况:(1)如果try代码块中没有出现异常,try代码块执行结束后,跳过catch语句,执行finally中的语句。(2)如果try监视的可能产生异常的代码块出现异常并被catch捕获时,程序将跳过try中的其余语句,转去执行catch中的代码块,然后执行finally中的语句。(3)如果try监视的可能产生异常的代码块出现异常但没有被catch捕获时,程序将跳过try中的其余语
31、句和catch语句,执行finally中的语句。9.3.1 try-catch-finally语句例9-8 使用try-catch-finally语句完成输入不匹配异常处理。import java.util.*;public class InputMismatch2 public static void main(String args) System.out.print(请输入课程代号(13):);Scanner sc = new Scanner(System.in);try int courseCode = sc.nextInt();switch (courseCode) case 1:S
32、ystem.out.println(English);break;case 2:System.out.println(Java);break;9.3.1 try-catch-finally语句case 3:System.out.println(DB);break;default:System.out.println(您输入的数字超出了范围!); catch (Exception e) System.out.println(输入不为数字!);e.printStackTrace();finallySystem.out.println(谢谢使用!);9.3.1 try-catch-finally语句
33、程序运行结果:请输入课程代号(13):i输入不为数字!java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:909) at java.util.Scanner.next(Scanner.java:1530) at java.util.Scanner.nextInt(Scanner.java:2160) at java.util.Scanner.nextInt(Scanner.java:2119) at s2Java.sg.ch04.AccpException.main(AccpException.
34、java:14)谢谢使用!程序说明:在本程序中,使用了try-catch-finally完成异常处理。从程序运行结果看,只要有finally代码块,不管try代码块是否产生异常,catch代码块中的异常处理代码是否执行,finally代码块总是要被执行的。根据这个特点,通常用finally代码块完成一些资源释放、清理的工作。如关闭try代码块中所有打开的文件,断开网络连接等。9.3.2 throw语句在Java语言中,异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出外,也可以根据需要人工创建并抛出。throw语句的一般形式为: throw 异常对象;用throw语句抛出异常,一般放在
35、方法内部,一个程序可以有多个throw。throw关键字后面的异常对象用来说明抛出的异常类型。throw语句执行时,其后面的代码将不再执行。由throw抛出的异常也必须由try-catch语句捕获并处理。如果throw抛出的异常对象被相应的catch语句捕获,程序将转去执行相应的异常处理代码。9.3.2 throw语句例9-9 输入李雷同学的学号,当输入的学号不合理时人工抛出异常。import java.util.*;public class Student private String id;/ 学号,长度应为10位public void setId(String d) /判断学号的长度是否
36、为10if (d.length() = 10) id = d; else trythrow new IllegalArgumentException(学号长度应为10位!);catch(IllegalArgumentException e) System.out.println(e.getMessage(); 9.3.2 throw语句public static void main(String args) Student stu= new Student();Scanner sc=new Scanner(System.in);System.out.println(请输入李雷同学的学号:);S
37、tring id=sc.nextLine();stu.setId(id);程序运行结果: 请输入李雷同学的学号:2学号长度应为10位!程序说明:在本程序中,方法setId()中使用throw语句人工抛出了异常。当在主函数中向setId()方法传递的学号不合理时,执行throw语句抛出异常,由catch语句捕获异常并进行处理,执行相应的异常处理语句,输出e.getMessage()中获取的throw抛出的异常信息。在一个方法中人工抛出、捕获并处理异常,这样做的好处是,将异常处理程序与普通实现算法程序分开,使程序更清晰,可读性更好。9.3.3 throws语句在Java程序中,如果一个方法中可能产
38、生异常,而该方法又不想处理或不能处理该异常,则可以在方法声明时,采用throws语句声明该方法将异常抛出。这样可以把异常抛回给该方法的调用方法进行处理,若调用方法仍不能处理可继续上抛。throws声明抛出异常的语法格式如下:返回值类型 方法名称(参数列表) throws 异常列表方法体9.3.3 throws语句例9-10 在上例基础上,声明抛出异常。import java.util.*;public class Student private String id;/ 学号,长度应为10位public void setId(String d) throws IllegalArgumentExc
39、eption/判断学号的长度是否为10if (d.length() = 10) id = d; else throw new IllegalArgumentException(学号长度应为10位!);public static void main(String args) Student stu= new Student();Scanner sc=new Scanner(System.in);System.out.println(请输入李雷同学的学号:);String id=sc.nextLine();try stu.setId(id); catch (IllegalArgumentExcep
40、tion e) System.out.println(e.getMessage();9.3.3 throws语句程序运行结果: 请输入李雷同学的学号:201402学号长度应为10位!程序说明:在本程序中,setId()方法可能产生IllegalArgumentException异常,而方法内又不想处理该异常,因此在setId()头部加上throws IllegalArgumentException,表示对于该异常程序不处理,交由上层调用方法进行处理。在此程序中,异常由调用setId()方法的主函数完成处理。如果在main()方法中,调用了可能产生异常的方法而无法处理该异常时,同样可以声明抛出异
41、常。main()方法抛出的异常由Java虚拟机捕获并处理。9.4自定义Java异常在Java语言中已经定义了很多异常类,但当Java提供的异常类不能满足需要,程序需要对自己抛出的异常类进行特殊处理时,可以自定义异常。自定义异常通过创建Exception类(或其子类)的子类来定义。自定义异常类的基本格式如下:权限修饰符 class 自定义异常类 extends 父类 类体这里父类应为Exception类或是其子类。9.4自定义Java异常例9-11 用自定义异常类判定学生的百分制成绩是否合理。class ScoreException extends Exception /自定义异常类ScoreExceptionprivate String message;public ScoreException(int m)message=成绩+m+不合理;public String toString()return message;class Scoreprivate int score;public void set
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吴家窑11号线施工方案
- 路基堆土预压施工方案
- 提灌站维护施工方案
- 福建海鲜冷库施工方案
- 钻空施工方案
- 年加工300万吨尾矿废料改扩建及技术改造项目环评报告表
- 一级建造师沥青施工方案
- 海南汽车变速箱保税维修项目环评报告表
- 苍南县二模数学试卷
- 洛阳户外儿童游乐施工方案
- 浙江杭州余杭区余杭街道招考聘用编外人员16人(必考题)模拟卷及答案
- 腹腔穿刺术(仅供参考)课件
- 四川大学C语言上机考试题
- 2022年芜湖职业技术学院职业适应性测试题库及答案解析
- 幼小衔接拼音课程 课件(共49张PPT)
- 免费推广软件大全汇总
- 建筑公司一般部门设置与岗位职责
- 法兰理论重量表正式版
- 三年级下册口算天天100题(A4打印版)(共32页)
- 企业经营沙盘模拟课件 99页PPT
- 汽车行业MSA测量系统分析(共98页).ppt
评论
0/150
提交评论