finally
异常机制中还有一个重要的部分,就是finally。catch后面可以跟finally语句
try {
// 可能抛出异常
} catch(Exception e) {
// 捕获异常
} finally {
// 不管有无异常都会执行
}
如果在try或者catch语句内有return语句,则return语句在finally语句执行结束后才执行,但finally并不能改变返回值
public int testReturn() {
int ret = 0;
try {
ret = 5;
return ret;
} finally {
ret = 2;
}
}
该方法返回5。
如果在finally中有return语句。try和catch内的return会丢失,实际会返回finally中的返回值。同时还会掩盖try和catch内的异常,就像没有异常发生一样
public int testReturn2() {
int ret = 0;
try {
ret = 10 / 0;
return ret;
} finally {
return 8;
}
}
会返回8。
在finally中,如果抛出了异常,则原异常也会被覆盖
try {
ret = 10 / 0;
} finally {
throw new RuntimeException("Hi");
}
所以,一般而言,应该避免在finally中使用return语句或者抛出异常。
finally一般用于释放资源,如数据库连接、文件流等。
try-with-resources
对于一些使用资源的场景,比如文件和数据库连接,典型的使用流程是首先打开资源,最后在finally语句中调用资源的关闭方法。 针对这种场景,在Java7开始支持一种新的语法,称之为try-with-resources
,这种语法针对实现了java.lang.AutoCloseable接口的对象,提供了try-with-resources功能。
该接口定义为
public interface AutoCloseable {
void close() throws Exception;
}
没有使用try-with-resources:
public void useResource() {
// 创建资源
AutoCloseable r = new FileInputStream("test");
try {
// 使用资源
} finally {
r.close();
}
}
使用try-with-resources:
public void useResource() {
// 创建资源
try(AutoCloseable r = new FileInputStream("test");) {
// 使用资源
}
}
资源r的声明和初始化放在try语句内,不用再调用finally,在语句执行完try语句后,会自动调用资源的close()方法。
资源可以定义多个,以分号分隔
throws throw
throws
定义一个方法的时候可以使用throws关键字声明。使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。
throw
throw关机字作用是抛出一个异常,抛出的时候是抛出的是一个异常类的实例化对象,