exception类java_Java常见异常种类
1、什么是异常
结构不佳的代码不能运⾏,这是Java的基本理念。
发现错误的理想时机是在编译期。然⽽,编译器并不能发现所有的错误,余下的问题就需要在程序运⾏时解决。这就需要错误能通过某种⽅式,把适当的信息 传递给特定的接收者处理。Java中的异常处理的⽬的在于通过使⽤少量的代码来简化⼤型、可靠的程序的⽣成,通过此⽅式让你的应⽤中没有未处理的错误,⽽ 且它还带来了⼀个明显的好处:降低错误处理代码的复杂度。
异常,根据字⾯理解,有意外之意。把它置于代码层⾯来理解,即阻⽌了当前⽅法或作⽤域继续执⾏。
在Java中,异常被当做对象来处理,其基类是Throwable。
try catch的使用方法2、Java中的异常类型
Java从Throwable直接派⽣出Exception和Error。其中Exception是可以抛出的基本类型,在Java类库、⽅法以及运⾏时故障中都可能抛出Exception型异常。Exception表⽰可以恢复的异常,是编译器可以捕捉到的;Error表⽰编译时和系统错误,表⽰系统在运⾏期间出现了严重的错误,属于不可恢复的错误,
由于这属于JVM层次的严重错误,因此这种错误会导致程序终⽌执⾏。Exception⼜分为检查异常和运⾏时异常。
异常类的结构层次图如下:
典型的RuntimeException(运⾏时异常)包括NullPointerException, ClassCastException(类型转换异
常),IndexOutOfBoundsException(越界异常), IllegalArgumentException(⾮法参数异常),ArrayStoreException(数组存储异
常),AruthmeticException(算术异常),BufferOverflowException(缓冲区溢出异常)等;
⾮RuntimeException(检查异常)包括IOException, SQLException,InterruptedException(中断异常-调⽤线程睡眠时
候),NumberFormatException(数字格式化异常)等。
⽽按照编译器检查⽅式划分,异常⼜可以分为检查型异常(CheckedException)和⾮检查型异常 (UncheckedException)。Error和RuntimeException合起来称为UncheckedException,之所以这么 称呼,是因为编译器不检查⽅法是否处理或者抛出这两种类型的异常,因此编译期间出现这种类型的异常也不会报错,默认由虚拟机提供处理⽅式。除了Error 和RuntimeException这两种类型的异常外,其它的异常都称为Checked异常。
3、Java如何处理异常
3.1 try-catch, try-finally, try-catch-finally
对于checked类型异常,我们要么对它进⾏处理,要么在⽅法头使⽤throws抛出。public static void createFile() throws IOException{
File file = new File("C:/");
if(!ists()){
}
}
public static void main(String[] args) {
try {
createFile();
} catch (IOException ex) {
// handle exception here
}
}
关于catch需要注意的⼏点:
1)、参数的异常类型必须是Throwable类或者其⼦类。
2)、从上往下的catch语句,其参数类型必须按照从⼦类到⽗类顺序,因为⼀旦匹配到⼀个类型,就会忽略往后的catch。⽐如IOException必须放到Exception前⾯,否则编译器会报错。
3)、可以有⼀个或者多个catch语句,甚⾄如果有finally语句的情况下,可以没有catch语句,如try-finally。
想要捕获多个异常,可以使⽤多个catch语句,JDK7以后提供了另外⼀种⽅式:多重捕获(multi-catch)。try{
// other code
} catch (IOException | SQLException ex) {
throw ex;
}
4)、不要忽略异常。空的catch块会使异常达不到应有的⽬的,除⾮诸如关闭FileInputStream的时候,因为你还没有改变⽂件的状态,因此不必执⾏任何恢复动作,并且已经从⽂件中读取到所需要的信息,因此不⽤终⽌正在进⾏的操作。
关于finally需要注意的⼏点:
1)、finally中的代码总是会被执⾏,除⾮在执⾏try或者catch语句时虚拟机退出(it(1))。
2)、finally块可以做⼀些资源清理⼯作,如关闭⽂件、关闭游标等操作。
3)、finally块不是必须的。
另外,如果在try和finally块中都执⾏了return语句,最终返回的将是finally中的return值。
3.2 异常链
常常想要在捕获⼀个异常后抛出另外⼀个异常,并且希望把原始异常信息保存下来,这就是异常链。在JDK1.4以后,Throwable⼦类在构造器 中可以接受⼀个cause对象作为参数,表⽰原始异常,通过这样把原始异常传递给新的异常,使得即使在当前位置创建并抛出了新的异常,也能通过这个异常链 追踪到异常最初发⽣的位置。
但在Throwable⼦类中,只有Error, Exception, RuntimeException三类异常类提供了带cause参数的构造器,其它类型的异常则需要通过initCause()⽅法。例如定义了CustomException类,可以这样使⽤:CustomException cmex = new CustomException();
cmex.initCause(new NullPointerException);
throw cmex;
这样⼀来,CustomException继承⾃Exception或RuntimeException,就属于⾃定义异常了。
⼀般来说,⾃定义异常的作⽤有以下情形:
1)、将检查型异常转换为⾮检查型异常。
2)、在产⽣异常时封装上下⽂信息、定义异常码、收集环境对象,有利于信息的传递。
4、异常使⽤指南
1)、在知道该如何处理的情况下才捕获异常。
2)、⾃定义异常类型,⽤以封装所有的检查型异常。
3)、在程序的边界进⾏异常捕获。如服务端相应客户端的请求,在出⼝处catch内部有可能产⽣的异常,并统⼀throw⼀个封装过的异常给客户端,免得暴露服务端敏感信息。
4)、只针对异常的情况才使⽤异常。不要在所有的代码中习惯性地使⽤try-catch,因为这会影响性能。
5)、抛出与抽象相对的异常。如果⽅法抛出的异常与它执⾏的任务没有明显的联系,这种情形会使⼈不知所措。为了避免这个问题,更⾼层的实现应该捕获 低层的异常,同时抛出可以按照⾼层抽象进⾏解释的异常,这种做法被称为异常转译(exception translation),如下:try{
// use lower-level abstraction to do our bidding
} catch(LowerLevelException ex){
throw new HigherLevelException(...);
}
另外⼀种特殊的异常转译称为异常链,上⾯已作描述。如果低层的异常对于调试导致⾼层异常的问题⾮常有帮助,使⽤异常链就很合适。⾼层的异常提供访问⽅法(Cause)来获得低层的异常。
6)、每个⽅法抛出的异常要有⽂档描述。利⽤Javadoc的@throws标记,记录抛出每个异常的条件。如
果⼀个⽅法可能抛出多个异常,不要使 ⽤这些异常类的某个超类。如不要声明⼀个⽅法“throws Exception”或“throws Throwable”,这将没有任何指导信息。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。