编译错误:是由于没有遵循Java语言的语法规则而产生的,这种错误要在编译阶段排除,否则程序不可能运行
逻辑错误:编译正常,也能运行,但结果不是人们期待的
运行时错误:运行过程中出现的错误,也有可能由逻辑错误引起
异常处理:主要目的是即使在程序运行时发生了错误,也要保证程序能正常结束,避免由于错误而使正在运行的程序中途停止
Java中所有的异常都用类表示,在JAVA中预定义了很多异常类,每个代表一种类型的运行错误。当程序发生异常,会生成某个异常类的对象
Java异常类都是系统类库中的Exception类的子类,他们分布在Java.lang .Java.io java.util java.net包中,每个异常类对应特定的运行错误,各个异常类采用继承的方式进行组织。
异常举例:
public static void main(String args[]){
int arr[]=new int[2];
for(int i=0;i<3;i++){
arr[i]=i;
System.out.println(arr[i]);
}
}
运行结果:
0
1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at tulun.Ex.main(Ex.java:7)
JAVA对异常的处理涉及两个方面的内容:
一是抛出(throw)异常
二是捕捉(catch)异常
如果程序在运行过程中出现了运行错误,并且产生的异常与系统中预定义某个异常类相对应,系统就自动产生一个该异常类的对象,这个过程称为抛出异常。当异常对象抛出时,将在程序中寻找处理这个异常的代码,如果找到处理代码,则把异常交给改代码段进行处理,这个过程称为捕捉异常。如果程序中没有给出处理异常的代码,则把异常交给Java运行系统默认的异常处理代码进行处理。默认的处理方式是:首先显示描述异常信息 的字符串,然后终止程序的运行。
异常抛出:
两种方式:系统自动抛出和利用抛出语句抛出
1.由系统自动抛出异常
在程序运行过程中,如果出现了可被Java运行系统识别的错误,系统自动产生与该错误相对应的异常类的对象,即自动抛出异常,如上面的例子
2.人为异常抛出
Throws语句抛出异常格式:
修饰符 返回值类型 方法名([参数表]) throws 异常类1,异常类2{
....................
}
例子:
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");
}
}
结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at tulun.Ex.main(Ex.java:8)
Throw语句抛出异常:
如果需要在方法内某个位置抛出异常,可以使用Throw语句,通常将Throw语句与if语句配合使用
格式:
1.throw 异常类对象名
2.throw (new 异常类名())
说明:
执行throw语句时,程序终止执行后面的语句,在程序中寻找处理异常的代码;如果程序中没有给出处理代码,则把异常交给java运行系统处理
例1:
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);
}
Exception in thread "main" java.lang.ArithmeticException
at tulun.Ex.main(Ex.java:6)
例2:
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");
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
Before throw ArrayIndexOutOfBoundsException
例3:
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(c[a]);
}
Before throw
Exception in thread "main" java.lang.ArithmeticException
at tulun.Ex.main(Ex.java:8)
捕捉异常:
程序自己捕捉和处理异常,需要建立try---catch--finally语句块
结构:
try{
//发生的异常
}
catch(异常类1 e1){
//处理异常 1;
}
...
catch(异常类n en){
//处理异常 n;
}
finally{
//不论异常是否发生,都要执行的部分;
}
说明:
(1)将可能发生异常的程序代码放置在try程序中。如果该块内的代码出现了异常,系统将终止try块代码的执行,自动跳转到所发生的异常类对应的catch块中,执行该块中的代码。如果程序运行正常,后面的各个catch块不起任何作用
(2)final 块是个可选项,无论异常是否发生,finally块的代码必定执行。通常把对各种异常共同处理部分放在finally块中。如输出统一信息,释放资源,
(3)一个try可对应多个catch块,用于对多个异常类进行捕获。但最多只能选中一个执行
(4)异常对象与catch块中声明的实例的匹配原则:
异常对象是catch块中声明的异常类的实例;
异常对象是catch块中声明的异常类的某一个子类的实例;
例:
public static void main(String args[]) {
int b=0,a;
try{
System.out.println("Before throw");
a=5/b;
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("处理下标越界 ");
System.out.println("捕获的异常为"+e);
}
finally{
System.out.println("try-catch-finally块");
}
System.out.println("最后的代码");
}
Before throw
处理算数异常catch块的捕获
捕获的异常为java.lang.ArithmeticException: / by zero
try-catch-finally块
最后的代码
例2.
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(c[a]);
if(b==0) throw(new ArithmeticException());
System.out.println(a/b);
System.out.println("the exception is throw,the statement is't run");
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("处理下标越界 ");
System.out.println("捕获的异常为"+e);
System.out.println(c[a]);
}
catch(ArithmeticException e){
System.out.println("处理算数异常catch块的捕获");
System.out.println("捕获的异常为"+e);
System.out.println(a/b);
}
finally{
System.out.println("try-catch-finally块");
}
System.out.println("最后的代码");
}
处理下标越界
捕获的异常为java.lang.ArrayIndexOutOfBoundsException
try-catch-finally块