异常处理注意点

异常处理流程

  1. 执行时出现异常,系统生成异常对象
  2. 系统寻找能出来该异常对象的 catch 块
  3. 若找到合适的 catch(catch 的对象是异常对象或它子类)
  4. 则把该异常交给该 catch 快处理,这个过程被称为捕获(catch)异常
  5. 程序继续正常运行。

如果 java 运行时环境找不到捕获异常的 catch 块,程序停止运行,也叫程序崩溃、挂了。

不管程序代码块是否处于 try 块中,甚至包括 catch 块中的代码,只要执行该代码块时出现了异常,系统都会自动生成一个相应的异常对象。若程序没有为该段代码定义任何的 catch 块,java 运行时环境就会因为无法找到处理该异常的 catch 块,程序就会在此退出。


{} 问题

try 块和 if 语句不一样,try 块后面的 {} 不可省略,即使 try 块里有且仅有一行代码,也不可以。同时 catch 块和 finally 也是不可以的。

根据前面说明,显而易见的:try 块中声明的变量是代码块内的局部变量,出了 try 块无效


先小后大

进行异常捕获时,一定要记住先捕获小异常,后不会大异常


捕获多异常

java 7 开始,一个 catch 块可以捕获多种类型的异常

捕获多种类型异常时注意:

  1. 多种异常类型间有竖线(|)隔开
  2. 异常变量有隐式的 final 修饰,因此不可重新赋值。

try、catch、finally

finally 块常用语回收资源:数据库连接、网络连接、IO 资源

除非在 try 块、catch 块中调用了退出虚拟机的方法(System.exit(1)),否则不管在 try 块、catch 块中执行任何的代码,出现任何情况,即使 return 都不管用,异常处理的 finally 块无论如何都会被执行

注意:

通常情况下,不要再 finally 块中使用 return 或 throw 等导致方法终止的语句,一旦在 finally 块中使用了 return 或 throw 语句,将会导致 try 块、catch 块中的 return、throw 语句失效。

尽量避免在 finally 块中使用 return 或 throw 等导致方法终止的语句,否则可能出现一些很【奇怪】的情况


自动关闭资源的 try 语句

java 7 开始增强了 try 语句的功能 —— 它允许在 try 关键字后面跟一对圆括号,圆括号内可初始化一个多或多个资源,此处的资源指的是那些必须在程序结束时显示关闭的资源(数据库连接、网络连接、磁盘文件),try 语句在该代码块语句结束时自动关闭这些资源。

注意点:

  • 在 try 后圆括号的初始化的对象必须实现 AutoCloseable 或 Closeable 接口。
  • Closeabele 是 AutoCloseable 的子接口
  • 只能在 try 后的圆括号内同时声明和实例化,即必须保证实例化的该对象的作用域必须是 try 块内的局部变量。

代码,以下方式等价:

// 方式一
try (//
        InputStream inputStream = new FileInputStream("D:/demo.txt"); //
        OutputStream outputStream = new FileOutputStream("D:/demo.txt.back");//
) {
    int available = inputStream.available();
    if (available > 0) {
        byte[] bytes = new byte[available];
        inputStream.read(bytes);
        outputStream.write(bytes);
    }
} catch (FileNotFoundException e) {
    // TODO: handle exception
    e.printStackTrace();
} catch (IOException e) {
    // TODO: handle exception
    e.printStackTrace();
} catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
}

// 方式二
InputStream inputStream = null;
OutputStream outputStream = null;
try {
    inputStream = new FileInputStream("D:/demo.txt");
    outputStream = new FileOutputStream("D:/demo.txt.back");

    int available = inputStream.available();
    if (available > 0) {
        byte[] bytes = new byte[available];
        inputStream.read(bytes);
        outputStream.write(bytes);
    }
} catch (FileNotFoundException e) {
    // TODO: handle exception
    e.printStackTrace();
} catch (IOException e) {
    // TODO: handle exception
    e.printStackTrace();
} catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
} finally {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            inputStream = null;
        }
    }
    if (outputStream != null) {
        try {
            outputStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            outputStream = null;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值