异常处理流程
- 执行时出现异常,系统生成异常对象
- 系统寻找能出来该异常对象的 catch 块
- 若找到合适的 catch(catch 的对象是异常对象或它子类)
- 则把该异常交给该 catch 快处理,这个过程被称为捕获(catch)异常
- 程序继续正常运行。
如果 java 运行时环境找不到捕获异常的 catch 块,程序停止运行,也叫程序崩溃、挂了。
不管程序代码块是否处于 try 块中,甚至包括 catch 块中的代码,只要执行该代码块时出现了异常,系统都会自动生成一个相应的异常对象。若程序没有为该段代码定义任何的 catch 块,java 运行时环境就会因为无法找到处理该异常的 catch 块,程序就会在此退出。
{} 问题
try 块和 if 语句不一样,try 块后面的 {} 不可省略,即使 try 块里有且仅有一行代码,也不可以。同时 catch 块和 finally 也是不可以的。
根据前面说明,显而易见的:try 块中声明的变量是代码块内的局部变量,出了 try 块无效
先小后大
进行异常捕获时,一定要记住先捕获小异常,后不会大异常
捕获多异常
java 7 开始,一个 catch 块可以捕获多种类型的异常
捕获多种类型异常时注意:
- 多种异常类型间有竖线(|)隔开
- 异常变量有隐式的 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;
}
}
}