一、程序错误与处理
1.1、程序错误、发现时刻及错误处理原则
违反语法规范的错误称为语法错,在编译时发现。
语义上存在错误,则称为语义错,如除数为零,待打开的文件不存在,网络连接中断等,该错误运行时才能被发现。
系统无法发现逻辑错。
1.2、错误与异常
①错误(error)指程序运行时遇到的硬件或操作系统的错误。错误会导致程序无法运行,只能依靠外界干预,否则会一直处于非正常状态。如运行的类文件中没有main()方法,找不到.class文件
1.3、程序对错误与异常的三种处理方式
二、异常的捕获及处理
2.1、认识异常
异常的定义:异常是导致一个程序中断的指令流,一旦出现之后程序就将立即退出,
Exception本身又是Throwable子类,
public class Throwable implements Serializable
{
public Throwable()
public Throwable(String message)
public String getMessage() //获得异常信息
public String toString() //获得异常对象的描述信息
public void printStackTrace() //显示异常栈跟踪信息
}
此类有两个子类:此类有两个子类:
·Error:Error类对象由Java虚拟机生成并抛出给系统。如运行没有main()方法的类,所以一般不去处理。
·Exception:是在程序中发生的异常,一般都需要进行处理。
如果一个try语句之中同时有多个catch的话一定要记住的是,捕获范围小的异常要放在捕获范围大的异常之前,一般在开发中为了简单起见,大部分的异常都直接使用Exception接收即可。
2.2、处理异常
一个异常对象经历抛出、捕获及处理过程。创建一个异常类对象的过程称为抛出(throw)异常,获得异常对象的过程称为捕获(catch)异常,对异常执行相应操作的过程称为处理异常,异常对象由捕获它的语句进行处理。通常,这几个过程分别由不同的方法或虚拟机完成。
在Java中使用如下的语法进行异常的处理:
try{
可能出现异常的语句 ;
} catch(异常类型异常对象){
处理异常;
} catch(异常类型异常对象){
处理异常;
} ...
finally{
异常处理的统一出口 ;
}
在异常的处理中基本上都是采用如下的过程完成的:
1、每当一个异常产生之后,实际上都会自动生成一个异常类的实例化对象,如果此时编写了异常处理语句的话,则进行异常的处理,如果没有的话,则交给JVM进行处理。
2、使用了try捕获异常之后,将自动与catch中的异常类型相匹配,如果匹配成功,则表示可以使用此catch处理异常,如果都没有匹配成功的,则不能处理。
3、程序中不管是否出现了异常,如果存在了finally语句,都要执行此语句的代码。
2.3、throws关键字
throws关键字主要是用在方法的声明上,表示一个方法不处理异常,而交给被调用处进行处理。
throws关键字不光可以在普通的方法上使用,主方法上也可以使,如果在主方法上使用的话就表示一旦出现了异常之后,继续向上抛,表示由JVM进行处理了。
2.4、throw关键字
throw关键字是在程序中人为的抛出一个异常对象。
throw new Exception("抛着玩的!")
2.5、RuntimeException
如果将一个字符串变为整型数据类型,则可以使用Integer类中的parseInt()方法完成。
·public static int parseInt(String s) throws NumberFormatException
本方法中存在了throws关键字的声明,理论上讲,在调用时必须进行异常处理,但是从实际的使用中可以发现,即使不使用try…catch处理也没问题。
public class ExpDemo10 {
public static void main(String args[]) {
int x = Integer.parseInt("10") ;
}
};
想解释这个问题,必须观察NumberFormatException异常的继承结构:
RuntimeException和Exception的区别,Exception必须处理,而RuntimeException可以不用处理。
1.算术异常ArithmeticException:除数为02.空对象异常NullPointerExceptionint a[]= null;
a[0]= 1; //对空数组中的元素进行操作,产生空对象异常
Stringstr =null;
System.out.println(str.length()); //调用空对象的方法,产生空对象异常
3.类型强制转换异常ClassCastExceptionObjectobj =new Object();
Stringstr =(String)obj;
4.负数组长度异常NegativeArraySizeExceptionint a[]= newint[-1]; //产生负数组长度异常
5.数组下标越界异常ArrayIndexOutOfBoundsExceptionint a[]= newint[1];
a[1]= 1; //产生数组下标越界异常
6.数值格式异常NumberFormatExceptionint j =Integer.parseInt("abc"); //产生数值格式异常
2.6、异常处理的例子
之前的异常的处理语句:try…catch…finally、throw、throws实际上在开发中是要一起使用的,以下面的程序为例。
编写一个除法的操作,要求在计算开始的时候输出“开始计算”的信息,在计算完成之后,输出“结束计算”的信息,而且只要是出现了异常一定要交给被调用处处理。
class MyMath {
public int div(int i,int j) throws Exception{
System.out.println("================ 计算开始 ================") ;
int temp = 0 ;
try{
temp = i / j ;
}catch(Exception e){
throw e ; //向上抛
}finally{
System.out.println("================ 计算结束 ================") ;
}
return temp ;
}
};
public class ExpDemo11 {
public static void main(String args[]){
try{
System.out.println(new MyMath().div(10,0)) ;
}catch(Exception e){
e.printStackTrace() ;
}
}
};
2.7、自定义异常类
public class IllegalAgeException extends Exception //无效年龄异常类
{
public IllegalAgeException(String s)
public IllegalAgeException()
}
…………….
//捕获自定义异常类,而非Exception类
catch(IllegalAgeException e)
{
e.printStackTrace(); //显示异常栈跟踪信息
}