一、程序的错误类型
程序的错误可以抽象分为三类:语法错误、运行错误。逻辑错误。
语法错误:编程中输入不符合语法的规则,程序编译不通过,程序不能运行起来。又称为编译错误。分为三种:致命错误、错误和警告。
Eg:表达式不完整、缺少必要的标点符号、关键字输入错误、数据类型不匹配、循环语句或选择语句的关键字不匹配
运行错误:程序运行过程出现的错误,此类错误有特定的发生条件,因此能够准确的定位错误代码。
Eg:除法运算时除数为0、数组下标越界、文件打不开、磁盘空间不够、数据库连接错误。
逻辑错误:程序运行后,没有得到预期结果。
Eg:使用了不正确的变量,指令的次序错误、循环的条件不正确、程序设计的算法考虑不周全。
二、java的异常处理(错误处理)
程序的错误就是通常的异常,也叫Exception。
对于运行错误,Java语言中代表异常时,使用一个专门的类来代表一种特定的异常情况,在系统中传递的异常情况就是该类的对象,所有代表异常的类组成的体系就是Java语言中的异常类体系。
1、java异常类
Java的异常是一个对象,所有的异常都直接或间接地继承Throwable类。
Throwable------Error 错误子类
-------Exception 非运行时异常类
-------RuntimeException 运行时异常类
Java API中专门设计了java.lang.Throwable类,只有该类子类的对象才可以在系统的异常传递体系中进行。该类的两个子类分别是:
Error类
该类代表错误,指程序无法恢复的异常情况。对于所有的错误类型以及其子类,都不要求程序进行处理。常见的Error类例如内存溢出StackOverflowError等。
Excption类
该类代表异常,指程序有可能恢复的异常情况。该类就是整个Java语言异常体系中的父类。使用该类,可以代表所有异常的情况。
根据是否是程序自身导致的异常,将所有异常类分为两种:
1、RuntimeException及其所有子类
该类异常属于程序运行时异常,也就是程序自身的问题导致产生的异常,例如数组下标越界异常ArrayIndexOutOfBoundsException等。
该类异常在语法上不强制程序员必须处理,即使不处理这样的异常也不会发生语法错误。
2、其他Exception子类
该类异常属于程序外部的问题引起的异常,也就是程序运行时某些外部问题导致产生的异常,例如文件不存在异常FileNotFoundException等。
该类异常在语法上强制程序员必须进行处理,如果不处理会发生语法错误。
2、常见的error类
异常类名 用途
LinkageError 动态链接失败
VirtualMachineError 虚拟机错误
AWTError AWT错误
3、常见运行时异常类
异常类名 用途
ArithmeticException 数学运算异常,比如除数为零的异常
IndexOutOfBoundsException 下标越界异常,比如集合、数组等
ArrayIndexOutOfBoundsException 访问数组元素的下标越界异常
StringIndexOutOfBoundsException 字符串下标越界异常
ClassCaseException 类强制转换异常
NullPointerException 当程序试图访问一个空数组中的元素,或访问一个空对象中的方法或变量时产生的异常。
4、java的异常处理机制描述如下:
把生成异常对象并把它提交给运行时系统的过程称为抛出(throw)一个异常。
系统在方法的调用栈中查找,从产生异常的方法开始进行回溯,沿着被调用的顺序往前寻找,直到找到包含相应的异常处理方法为止。这过程称为捕获(catch)一个异常。
如该异常未进行成功捕获,则程序将终止运行。
5、异常捕获和处理
格式:
Try {
正常程序段,可能抛出异常;
}
Catch(异常类1 异常变量){
捕捉异常类1有关的处理程序段;
}
Catch(异常类2 异常变量){
捕捉异常类2有关的处理程序段;
}
············
Finally{
一定会运行的程序代码;
}
Try块——捕获异常
Catch——处理异常:Catch包括两个参数:一个是类名,指出捕获的异常类型,必须是Throwable类的子类;一个是参数名,用来引用被捕获的对象。Catch块所捕获的对象并不需要与它的参数类型精确匹配,它可以捕获参数中指出的异常类的对象及其所有子类的对象。
Finally块——最终处理
注意:
1、一个try、catch、finally块之间不能插入任何其它代码。
2、Catch可以有多个,try和finally只能有一个。
3、Try后面必须要跟catch、finally其中的一个,因此try、catch、finally语句只能省略catch、finally中的一个。
4、定义多个catch可精确定位java异常,越特殊的异常越在前面处理,越普遍的异常越在后面处理。
异常类常用方法
Void String getMessage()
返回异常对象的一个简短描述
Void String toString()
获取异常对象的详细信息
Void printStack Trace()
在控制台上打印异常对象和它的追踪信息
Eg:
Public classTryCatchDemo{
Public static void main(String args[]) {
try {
int a=8,b=0;
int c=a/b;
System.out.print(c);
}
//AirthmeticException是异常类的名称,e是引用的参数名称
catch(AirthmeticException e) {
System.out.printIn(“发生的异常简短描述是:”+e.getMessage());
System.out.printIn(“发生的异常详细信息是:”+e.toString());
}
}
}
三、异常的抛出
1、系统自动抛出异常,try catch
2、通过关键字throw将异常对象显性地抛出。
异常抛出的语法
throw new 异常类();
其中异常类必须是Throwable类及子类
Eg:
throw new ThrowableObject();
AirthmeticException e = new AirthmeticExceptio();
throw e;
throws子句的方法声明的一般格式如下:
<类型说明>方法名(参数列表)throws <异常类型列表>
{
方法体;
}
四、用户自定义异常
用户自定义的异常,只需继承一个已有的异常类就可以了,包括继承Exception类及其子类,或者继承已自定义好的异常类。如果没有特别说明,可以直接用Exception类作为父类。
Class 异常类名 extends Exception
{
···················
}
1、自定义异常类必须继承自Throwable或Exception类,建议用Exception类。
2、当自定义异常是从RuntimeException及其子类继承而来时,该自定义异常是运行时异常,程序中可以不捕获和处理它。
3、当自定义异常是从Throwable、Exception及其子类继承而来时,该自定义异常是编译时异常,即程序中必须捕获并处理。
使用自定义异常步骤如下:
首先通过继承java.lang.Exception类声明自定义的异常类
在方法的声明部分用throws语句声明该方法可能抛出的异常
在方法体的适当位置创建自定义异常类的对象,并用throw语句将异常抛出
调用该方法时对可能产生的异常进行捕获,并处理异常。