异常处理以一种简洁的方式表示了程序中可能出现的错误,以及应对这些错误的处理方式。
Java7对异常处理的2个重要改动:
- 支持在一个catch子句中同时捕获多个异常。
- 在捕获并重新抛出异常时的异常类型更加精确。
几个关键词:
- throws:用来声明一个方法可能抛出的异常,对方法体中可能抛出的异常都要进行声明。
- throw:用来在遇到错误的时候抛出一个具体的异常。
- try-catch-finally:则用来捕获异常并进行处理。
分类:
- Java中的异常有受检异常和非受检异常两类。
非受检异常指的是java.lang.RuntimeException和java.lang.Error类及其子类,所有其他的异常类都称为受检异常。 - 区别:两者的差别就在于使用受检异常时的合法性要在编译时刻由编译器来检查。因此受检测异常需要比非受检测异常更多的代码来避免编译错误。
目前的主流意见是,最好优先使用非受检异常。
try-with-resources语句
- 一个catch子句捕获多个异常
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/**
* try-with-resources
* 在使用try-with-resources语句的时候,异常可能发生在try语句中,也可能发生在释放资源时。
* 如果资源初始化时或try语句中出现异常
* ,而释放资源的操作正常执行,try语句中的异常会被抛出;如果try语句和释放资源都出现了异常,
* 那么最终抛出的异常是try语句中出现的异常,
* 在释放资源时出现的异常会作为被抑制的异常添加进去,即通过Throwable.addSuppressed方法来实现。
* 能够被try语句所管理的资源需要满足一个条件
* ,那就是其Java类要实现java.lang.AutoCloseable接口,否则会出现编译错误。当需要释放资源的时候
* ,该接口的close方法会被自动调用
* 与I/O相关的java.io.Closeable继承了AutoCloseable,而与数据库相关的java.sql.Connection
* 、java.sql.ResultSet和java.sql.Statement也继承了该接口。
*
* 资源申请原则: 谁申请,谁释放
*/
public class ResourceBasicUsage {
public String readFile(String path) throws IOException, IOException {
try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
StringBuilder builder = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
builder.append(line);
builder.append(String.format("%n"));
}
return builder.toString();
}
}
}
- 除了对单个资源进行管理之外,try-with-resources还可以对多个资源进行管理。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 除了对单个资源进行管理之外,try-with-resources还可以对多个资源进行管理。
*
* @author wangbaofu
*
*/
public class MultipleResourcesUsage {
public void copyFile(String fromPath,String toPath) throws IOException, IOException {
try(InputStream inputStream = new FileInputStream(fromPath);
OutputStream ouStream = new FileOutputStream(toPath)){
byte[]buffer = new byte[8192];
int len=-1;
while((len=inputStream.read(buffer))!=-1){
ouStream.write(buffer, 0, len);
}
}
}
}
- 实现 AutoCloseable 接口
/**
* 实现 AutoCloseable 接口
* @author wangbaofu
*
*/
public class CustomResource implements AutoCloseable {
@Override
public void close() throws Exception {
// TODO Auto-generated method stub
System.out.println("进行资源释放。");
}
public void useCustomeResource() throws Exception{
try(CustomResource resource= new CustomResource()){
System.out.println("使用资源。");
}
}
}