概述:
java异常处理主要是依赖于try,catch,finally,throw,throws.一般情况下,我们是将可能会引起异常的代码块放在try块之中。如果在try中的代码出现了异常,程序就会生成一个Exception对象,然后根据catch块之中声明的异常类,判断该使用哪一个catch块进行处理异常。在一个try块之后可以跟多个catch块。finall块主要用于关闭在try块里打开的资源。异常处理机制保证finall块里面的代码一定可以执行。
注:在try块里面的声明的变量是局部变量,不可以在catch块里面访问。
java 捕获异常流程
try{
//业务逻辑代码
}catch(ExceptionClass c1){
//异常处理代码
}catch(Exception c2){
//异常处理代码
}
在java中异常捕获是按照catch离try块的优先级进行的,也就是说会优先考虑紧跟在他后面的catch块,如果不是匹配的异常类的话就在向下寻找。所有catch块的安排并不是随意的,先把范围最小的异常类放在最前面,然后依次向后写,当然不一定要这样,具体可以按照自己的业务逻辑来编写。
在java7中提供了多异常捕获,使用方法:
try{
//业务逻辑代码
}catch(IndexOutOfBoundsException|NumberFormatException e){
//异常处理代码
}
java7使用(|)来进行多异常捕获,但是当进行多异常捕获时,异常变量(e)是默认·使用final 的。
在catch块中可以通过异常类的几个函数获得错误信息。
1.getMessage(); 返回异常的详细描述信息字符串
2.printStackTrace(); 将异常的跟踪栈信息输出到标准错误输出流
3.getStackTrace(); 返回异常的跟踪栈信息。
使用finally回收资源
这里fianlly的回收资源跟java的垃圾回收机制有很大的区别,垃圾回收机制是回收在内存之中不在使用的对象,而finally是回收打开的物理资源,比如数据库连接,磁盘文件等。在finally里面的代码无论是否发生异常都会得到执行。即使在try块或者catch块之中使用了return语句,也会先跳转到finally,执行完finally的代码之后在回到try或者catch块。所以要避免在finally里面使用return等语句,这样会使try或者catch块代码失效。
异常处理的嵌套
try{
//业务逻辑代码
}catch(Exception e){
//处理异常代码
try{
//业务逻辑代码
}catch(Exception e){
//异常处理代码
}
}
java7的自动关闭资源
可以在try之后使用一个()来声明要初始化资源,这代表在执行完之后,java7会自动关闭这些资源,不过他们都必须实现AutoCloseable或者Closeable接口。不过不用担心自己要写很多代码,其实java7已经几乎把所有可能用到的“资源类”都实现了以上接口。
java的throws声明抛出异常
当遇到一个不知道该怎么处理的异常时,可以使用throws来抛出这个异常,把它交给调用者来处理,一直回溯到main().如果main()也不知道如何处理,就会交给JVM进行处理。它会打印错误信息,并且终止程序的运行。
隐藏原始错误信息
在进行开发的时候总是会出现各种各样的异常,但是很多异常的错误信息对于用户来说是没有用的,他们并不会想知道IndexOutOfBoundsException的错误信息。这个时候就可以使用 catch叫throw(不是throws)来构成异常链。
try{
//业务逻辑代码
}
catch(IndexOutOfBoundsException e){
throw new Exception("输入的数据量错误");
}