nullnullJava的异常处理程序中的错误可分为三类:程序中的错误可分为三类:编译错误、逻辑错误和运行时错误。
编译错误是由于没有遵循Java语言的语法规则而产生的,这种错误要在编译阶段排除,否则程序不可能运行。
逻辑错误是指程序编译正常,也能运行,但结果不是人们所期待的。
null 运行时错误是指程序运行过程中出现了一个不可能执行的操作,就会出现运行时错误,运行时错误有时也可以由逻辑错误引起。
异常处理的主要目的是即使在程序运行时发生了错误,也要保证程序能正常结束,避免由于错误而使正在运行的程序中途停止。什么是异常?什么是异常?异常处理机制是JAVA语言的重要特征之一。通过异常处理机制可防止程序执行期间因出现错误而造成不可预料的结果。一个好的应用程序,除了具备用户要求的功能外,还要求能预见程序执行过程中可能产生的各种异常,并把处理异常的功能包括在用户程序中。null异常是程序执行期间发生的各种意外或错误。比如说:
① 用户输入出错
② 所需文件找不到
③ 运行时磁盘空间不够
④ 内存不够
⑤ 算术运算错 (数的溢出,被零除…)
⑥ 数组下标越界
......null在Java程序运行过程中,产生的异常通常有三种类型:
一是JAVA虚拟机由于某些内部错误产生的异常,这类异常不在用户程序的控制之内,也不需要用户处理这类异常;
二是标准异常类,由java系统预先定义好的。这类异常是由程序代码中的错误而产生的,如:以零为除数的除法,访问数组下标范围以外的数组元素,访问空对象内的信息,这是需要用户程序处理的异常。
三是根据需要在用户程序中自定义的一些异常类。nullJava中所有的异常都是用类表示的,在JAVA中预定义了很多异常类,每个代表了一种类型的运行错误。当程序发生异常时,会生成某个异常类的对象。
Java解释器可以监视程序中发生的异常,如果程序中产生的异常与系统中预定义某个异常类相对应,系统就自动产生一个该异常类的对象,就可以用相应的机制处理异常,确保程序能够安全正常地继续运行。
异常对象中含有这种运行错误的信息和异常发生时程序的运行状态。null二、Java中标准异常类的层次结构 针对各种类型的异常,Java定义了许多标准异常类,所有的Java异常类都是系统类库中的Exception类的子类,它们分布在java.lang、java.io、java.util和java.net包中。每个异常类对应一种特定的运行错误,各个异常类采用继承的方式进行组织。异常类的层次结构图如下图所示:nullJava中异常类的结构:nullThrowable类有两个直接子类: Error(致命错误) 和Exception(异常)。
Error类型的异常与JAVA虚拟机本身发生的错误有关,这类异常由java直接处理,用户程序一般不能太做什么,只能等待系统通知用户关闭程序。
用户程序产生的错误由Exception的子类表示。用户程序应该处理这类异常。null1、Throwable类 该类属于Java.lang包,是所有异常类的父类.在Throwable类中定义了描述异常发生的位置和所有异常类共同需要的内容.Throwable类的构造
数Throwable类的构造函数(1) public Throwable() 以null作为错误信息串内容创建Throwable对象,同时调用该对象的另一方法fillInStackTrace
异常发生的位置。Throwable类的主要成员函数Throwable类的主要成员函数Throwable类的主要成员函数(续)Throwable类的主要成员函数(续)null Error类是Throwable类的子类,由系统保留,用户不能使用。也就是说, Error类型的错误不允许用户插手处理,由Java系统自行处理。
Error类描述系统错误:如将字节码装入内存的过程中和对字节码进行检查的过程中遇到的问题、java的内部错误、资源耗尽的情况。
这类异常由java直接处理,用户程序不要理会这类异常。2、Error类null Exception类是Throwable类的子类,用户程序中可以直接使用Exception类处理Exception类型的异常。Exception类不仅继承了Throwable类的方法,同时定义以下两个构造函数:
public Exception()
public Exception(String s)
说明:
字符串s用来接收传入的字符串信息,该信息通常是 对错误的描述。
3、Exception类null异常程序举例://java直接处理运行时异常
class TestSystemException{
public static void main(String[ ] args){
int num[ ]=new int[2];
for(int i=1;i<3;i++){
num[i]=i;
System.out.println(“num[”+i+”]=”+i);
}
}
}
该程序产生的输出见程序的运行.三、异常的处理机制三、异常的处理机制Java对异常的处理涉及两方面的内容:
一是抛出(throw)异常
二是捕捉(catch)异常
如果程序在运行过程中出现了运行错误,并且产生的异常与系统中预定义某个异常类相对应,系统就自动产生一个该异常类的对象,这个过程称为抛出(throw)异常。当有异常对象抛出时,将在程序中寻找处理这个异常的代码,如果找到处理代码,则把异常对象交给该段代码进行处理,这个过程称为捕捉(catch)异常。如果程序中没有给出处理异常的代码,则把异常交给Java运行系统默认的异常处理代码进行处理。默认的处理方式是:首先显示描述异常信息的字符串,然后终止程序的运行。
null四、异常的抛出(throw) 抛出异常有两种方式:由系统自动抛出和利用抛出语句抛出。
1 由系统自动抛出异常
在程序运行过程中,如果出现了可被Java运行系统识别的错误,系统会自动产生与该错误相对应的异常类的对象,即自动抛出。例如上例。
2 人为异常抛出
两种方式:
① 在方法头写出需要抛出的异常(利用throws语句)
② 在方法体内抛出异常(利用throw语句)nullThrows语句抛出异常
: 修饰符 返回值类型 方法名([形参表])throws 异常类名1,异常类名2,……
{……}
说明:
在执行该方法的过程中,如果出现了由throws列出的异常,则可以抛出异常,并在程序中寻找处理这个异常的代码;如果程序中没有给出处理异常的代码,则把异常交给Java运行系统默认的异常处理代码进行处理。Throws语句举例Throws语句举例class Throws_Exp
{ public static void main(String[] args) throws ArithmeticException,ArrayIndexOutOfBoundsException
{ int a=4,b=0,c[]={1,2,3,4,5};
System.out.println(a/b);
System.out.println(c[a+1]);
System.out.println(“end”);
}}
nullThrow语句抛出异常 如果需要在方法内某个位置抛出异常,可以使用Throw语句,通常将Throw语句和if语句配合使用。
格式:
① throw 异常类对象名
② throw (new 异常类名());
说明:
执行throw语句时,程序终止执行后面的语句,在程序中寻找处理异常的代码;如果程序中没有给出处理代码,则把异常交给Java运行系统处理。Throw语句举例1Throw语句举例1class Throw_Exp1 {
public static void main(String[] args) {
ArithmeticException e=new ArithmeticException();
int a=4,b=0;
System.out.println(“Before ArithmeticException”);
if(b==0) throw e;
System.out.println(a/b);
}}
Throw语句举例2Throw语句举例2class Throw_Exp2 {
public static void main(String[] args) {
int a=5,c[]={1,2,3,4,5};
System.out.println(“Before throw ArrayIndexOutOfBoundsException”);
if(a>4) throw (new ArrayIndexOutOfBoundsException()); System.out.println(“After throw ArrayIndexOutOfBoundsException”);
}}
Throw语句举例3Throw语句举例3class Throw_Exp3 {
public static void main(String[] args) {
int a=5,b=0,c[]={1,2,3,4,5};
System.out.println(“Before throw”);
if(b==0) throw (new ArithmeticException ()); System.out.println(a/b);
if(a>4) throw (new ArrayIndexOutOfBoundsException());
System.out.println(a/b);
}}
null五、捕捉异常 在前面给出的例子中,由于程序中都没有给出处理异常的代码,因此抛出的异常都被Java运行系统捕捉,由Java运行系统进行相应处理。一般来说,在设计程序过程中,如果能够预测程序中可能发生 的异常,则应在程序中给出处理代码。而不交给Java运行系统处理,对于程序中那些不能预测的异常,可交给Java运行 系统处理。
要由程序自己捕捉和处理异常,需要建立try - catch-finally语句块。
nulltry - catch语句块格式:Try-catch-finally结构说明:(1)将可能发生异常的程序代码放置在try程序块中。如果该块内的代码出现了异常,系统将终止try块代码的执行,自动跳转到所发生的异常类对应的catch块中,执行该块中的代码。如果程序运行正常,后面的各catch块不起任何作用。
(2)finally块是个可选项,无论异常是否发生,finally块的代码必定执行。通常把对各种异常共同处理部分放在finally块中,如输出统一信息、释放资源、清理内存、关闭已打开的文件等。
(3)一个try块可以对应多个catch块,用于对多个异常类进行捕获。但最多只能选中一个执行。
(4)异常对象与catch块中声明的实例的匹配原则:
异常对象是catch块中声明的异常类的实例;
异常对象是catch块中声明的异常类的某一子类的实例;
Try-catch-finally结构说明:try - catch-finally语句举例1try - catch-finally语句举例1class Try_Catch_Exp1{
public static void main(String[] args) {
int d=0,a;
try {System.out.println("Before throw Exception");
a=5/d;
System.out.println("the Exception is throw,The statement is't run"); }
catch(ArithmeticException e) {
System.out.println("处理算数异常的catch语句块捕获了异常!");
System.out.println("捕获的异常为"+e); }
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("处理数组下标越异常的catch语句块捕获了异常!");
System.out.println("捕获的异常为"+e); }
finally { System.out.println("这是所有catch块的共有部分!"); }
System.out.println("try-catch-finally块后面的语句"); } }
try - catch-finally语句举例2try - catch-finally语句举例2class Try_Catch_Exp2{
public static void main(String[] args) {
int a=5,b=0,c[]={1,2,3,4,5};
try {
System.out.println("Before throw");
if(a>4) throw (new ArrayIndexOutOfBoundsException());
System.out.println ("After throw"); }
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("处理数组下标越异常的catch语句块捕获了异常!");
System.out.println("捕获的异常为"+e); }
finally { System.out.println("这是所有catch块的共有部分!"); }
System.out.println("try-catch-finally块后面的语句"); }}
程序设计举例:程序设计举例:求三角形的面积或周长。
注意:三角形的三条边通过键盘输入,输入的数值构不成三角形的话,需要重新输入。六、用户自定义的异常类六、用户自定义的异常类 尽管Java提供了很多异常类,但用户还是可以根据需要定义自己的异常类,即创建自定义异常类。
说明:(1)用户自定义的异常类必须是Throwable类或Exception类的子类。(2)自定义的异常类,一般只要声明两个构造方法,一个是不用参数的,另一个以字符串为参数。作为构造方法参数的字符串应当反映异常的信息。用户自定义的异常类格式:其一般形式为:
class 自定义异常类名 extends Exception
{
异常类体;
}用户自定义的异常类格式:用户自定义的异常类说明:用户自定义的异常类说明:自定义异常类
class MyException extends Exception{
…
}用户定义的异常同样要用try--catch捕获,但必须由用户自己抛出 throw new MyException().用户自定义的异常类举例:用户自定义的异常类举例:class Exception_exp{
public static void main(String[] args){
try { System.out.println("2+3="+add(2,3));
System.out.println("-8+10="+add(-8,10));}
catch (Exception e)
{System.out.println("Exception is "+e);} }
static int add(int n,int m) throws UserException {
if (n<0|| m<0) throw new UserException();
return n+m; }}
class UserException extends Exception{
UserException(){super("数据为负数");}}null七、常见的系统预定义编译异常在包java.lang中声明的标准查检型(编译时发现)异常:
(1) ClassNotFoundException
指定名字的类或接口未找到。
(2) IllegalAccessException
在调用某方法时,找不到该方法的声明。例如,某方法在另一个包的类中声明,而该方法未声明为public。
(3) InstantiationException (实例化异常)
试图创建抽象类或接口的对象。
(4) InterruptedException (中断异常)
其它线程中断了当前线程。null包java.io中声明的标准检查型异常:
常用的系统预定义异常(续)(1) java.io.IOException(输入输出异常)
请求的I/O操作无法完成。以下几种异常是其子类。
(2) java.io.EOFException(文件结束异常)
在输入操作结束前遇到了文件尾。
(3) java.io.FileNotFoundException(未找到文件)
未找到指定的文件。作业作业1 什么是异常?什么是抛出异常?什么是捕捉异常? Throw语句和Throws语句的区别? try - catch-finally语句的执行过程。
2 分析“Throw语句举例3”和“ try - catch-finally语句举例2”,在“ try - catch-finally语句举例2”的基础上,编写利用If语句、Throw语句、try - catch-finally语句实现处理数组下标越界异常和被除数为0异常的程序。
3 创建一个Person类,成员变量为:姓名、性别、年龄,在构造函数中使用键盘输入为其成员变量赋值,显示其信息。使用对象数组创建至少两个Person对象。
要求:运用异常处理知识,对通过键盘输入的“性别”只能是“man”或“female”,输入有误,则要求重新输入;同样对于年龄的输入范围只能在0到120之间,输入有误,则要求重新输入。
注意:程序上机调试之前,需要先写在作业本上,上机调试时,程序的完善一定要注意从简单到复杂。