JAVA异常
一:异常的概念
1.异常的定义:
异常指的是程序运行过程中出现的非正常现像,例如用户输入错误,除数为零,需要处理的文件不存在,数组下标越界等问题。
2.异常的分类:
所有异常的根类为 java.lang.Throwable,Throwable下面又分了两个子类:Error 和Exception。
(1)Error:Error 类 指的是系统错误或运行环境出现错误,这些错误即使捕捉到也无法进行处理,由JAVA虚拟机生成并抛出,包括系统崩溃.动态链接失败虚拟机错误等。
ErrorUncheckde Exception
(2)异常Exception类指的一些可以被捕捉切可能恢复的异常情况,是一般程序中可预知的问题。可分为两类。
1)RentimeException(运行时异常):
RuntimeException(运行时异常):由系统检测,用户的Java程序可以不做处理,系统会自动交给异常处理程序。
2)非运行时异常:在程序中必须对其进行处理,否则编译器会指出错误。
Exception:Checked Exception ,Runtime Exception
二:异常的处理结构
Java异常的五个关键字:try,catch,finally,throw,throws,
try{
语句块;
}
catch(异常类名 参变量名){语句块;}
finally{语句块;}
try{
打开文件;分配内存;
//可能的语句异常块
}catch(打开文件夹失败){处理代码;}
catch(分配内存失败){处理代码;}
}
try: 捕获异常的第一步是用 try{…}选定捕获异常的范围,try 模块中的语句是程序正常流程要执行的语句,但是在执行过程中有可能出现异常。所有可能抛出异常的语句都放入 try 模块中。
catch(必有) :每个 try 代码块可以伴随一个或多个 catch 语句,用于处理 try 代码块中所生成的异常事件。catch 语句只 需要一个形式参数指明它所能够捕获的异常类型,这个类必须是 Throwable 的子类,运行时系统通过参数值把被抛弃的异常对象传递给 catch 块。在 catch 块中是对异常对象进行处理的代码,与访问其它对象一样,可以访问一个异常对象的数据成员或调用它的方法。
catch 语句的顺序: 捕获异常的顺序和 catch 语句的顺序有关,当捕获到一个异常时,剩下的 catch 语句就 不再进行匹配。因此, 在安排 catch 语句的顺序时,首先应该捕获最特殊的异常,然后 再逐渐一般化。也就是一般先安排子类,再安排父 类。
finally(可选) :
捕获异常的最后一步是通过 finally 语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分 以前,能够对程序的状态作统一的管理。不论在 try 代码块中是否 发生了异常事件,finally 块中的语句都会被执行。
抛出异常:
在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象,生成的异常对象将传递给Java运行时的系统,这一异常的产生和提交成为抛出(throw)异常。
声明抛出异常 :
(1) 一个方法不处理它产生的异常,而是沿着调用层次向上传递,由调用它的方法来处理这些异常,叫声明抛出异 常(throws)。声明抛出异常是一种消极的异常处理机制。
(2) 抛出异常就是产生异常对象的过程,首先要生成异常对象,异常或者由虚拟机生成,或者由某些类的实例 生成,也可以在程序中生成。在方法中,抛出异常对象是通过 throw 语句实现的。
例如:
IOException e=new IOException();
throw e ;
注意:
(3) 可以抛出的异常必须是 Throwable 或其子类的实例。
throws 子句中同时可以指明多个异常,之间由逗号隔开
(1)对 Error 类或其子类的对象,程序中不必进行处理。
(2)对 RuntimeException 类或其子类,程序中可以不必进行处理。
(3)除此之外的异常,程序员都应该在程序中进行处理。处理方式分为以下几种:
① 要么用 try-catch-finally 进行捕获处理
② 要么明确表示不处理从而声明抛出异常
③ 要么先捕获处理然后再次抛出。
在进行异常处理过程中应该注意:
Java 的异常处理机制(try-catch-finally 语句、throws 子句、throw 语句)带来 Java 程序代码结构上的改变。 ① 不能滥用异常机制。简单的出错判断建议用 if 语句。 ② 不要过分细分异常。