异常处理

异常处理以一种简洁的方式表示了程序中可能出现的错误,以及应对这些错误的处理方式。

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("使用资源。");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值