Java的异常处理
1 致命性的错误(错误):如程序进入了死循环,或递归无法结束,或内存溢出,这些运行错误都是致命的.致命性的错误只能在编程阶段解决,运行程序本身无法解决,只能依靠其他程序干预,否则会一直处于非正常阶段.
2 非致命的错误(异常)如运算时除于0,或操作数超出数据范围,或打开一个文件时发现文件并不存在,.或欲装入的类文件丢失,或网络连接中断,java通过在源程序中加入异常处理代码,当程序运行中出现异常时,由异常处理代码调整程序运行方向,使程序仍可继续运行直至正常结束.
异常处理的类层次
Java通过错误类(error)和异常类(Exception)来处理错误和异常,而他们是Throwable类的子类。
A 错误类Error:定义啦在通常情况下不希望被客户程序捕捉到的异常。Error类对象是由java虚拟机生成并虚拟机。生成并抛给系统。
B异常类Exception:这是用户程序能够捕捉到的异常..ExceptionL类对象是由java程序抛出和处理的。
异常类 | 描述 |
NullPointerException | 空指针异常 |
ArrayIndexOutOfBoundsException | 数组越界访问异常 |
ClassNotFoundException | 试图访问一个根本不存在的类 |
IOException | 输入/输出异常 |
NumberFormatException | 错误的类型转换异常 |
ArrayStoreException | 当向数组存入错误类型数据时 |
ArithmeticException | 除数为0的算术异常 |
未捕获的异常
Eg:classTestException1{
Publicstatic void main(String[] args)
{
Intd=0;
Inta=42/d;
}
}当java执行这个除法时,系统会检查到除数为0,他会构造一个“异常”对象来引发异常。此时就导致TestException停止。一个异常一旦被引发,必须被一个异常处理程序捕获并立即处理。该程序中并没有异常处理程序,所以异常被java运行时系统默认的程序捕获,任何不是被用户程序捕获的异常最终都会被该默认程序处理。默认处理程序显示一个描述异常类的字符串,打印异常发生处的堆栈轨迹并且终止程序。
程序输出的结果表明:在main线程中发生啦AirthmeticException异常,他是AirthmeticException的子类,更加明确的描述了何种类型的错误。
异常处理机制
在使用传统语言进行编程时,程序员只能通过函数的返回值来发出错误信息,但会导致更多存错误,通常的方法是,用全局变量errno来储“异常”的类型,但是因为一个errno的值有可能在被处理之前被另一个错误覆盖,所以很容易判断错误。
1 抛出异常
当程序发生变异时
try语句块
将程序中可能出现异常的代码放入try块中。
当try块中有语句引发异常时,系统将不再执行try块中未执行的语句,而执行匹配的catch块。
如果try块中没有语句引发异常,则程序执行完try块中的语句后不执行catch块中的语句,即跳过catch语句,继续执行后面的程序。
catch块
每个try语句后面必须伴随一个或多个catch语句,用于捕捉try语句块所产生的异常并作相应的处理。
使用try-catch-finally语句捕获和处理异常
格式:try{
//产生异常的语句
}catch(异常类1 变量){
//异常处理代码
}catch(异常类2 变量){
//异常处理代码
}[finally{
}]
使用try-catch-finally语句捕获和处理异常
格式:try{
//产生异常的语句
}catch(异常类1 变量){
//异常处理代码
}catch(异常类2 变量){
//异常处理代码
}[finally{
}]
catch子句的目标是解决“异常”情况,并像没有出错一样继续运行。
例如:try{
int d=0;
int a=42/d;
}catch(ArithmeticException e){
System.out.println(e.toString());
例8.3try-catch语句的执行顺序。
int a = 0,b = 0,c = 0; Random r=new Random();
for (int i= 0; i < 5; i++){
try{
b =r.nextInt(); c = r.nextInt();
a =12345 / ( b / c );
}catch(ArithmeticException e){
a = 0;
System.out.print("有被0除异常 ");
}
System.out.println("a:" + a);
}
注意:一个try和它的catch语句组成了一个单元。catch子句的范围限制于try语句块中的语句。一个catch语句不能捕获另一个try声明所引发的异常(除非是嵌套的try语句情况)。被try保护的语句声明必须在一个大括号之内。try语句块不能单独使用。