这是一个非常愚蠢的问题,但我不理解catch的结合使用,最后。据我所知,无论是否会引发异常,都会执行catch块之后的代码,为什么要使用
try
{
doSomething();
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
doSomethingInFinally();
}
而不是
try
{
doSomething();
}
catch(Exception e)
{
e.printStackTrace();
}
doSomethingInFinally();
?我总是看到人们使用第一种模式,但我认为这是额外的代码。
答案 0 :(得分:4)
有些情况下,您的建议无效
根本没有catch语句(如果抛出异常,该方法将不会继续执行)。
catch块重新抛出异常。
Throwable
)。答案 1 :(得分:2)
我能给你的最佳解释是引导你进入java doc
答案 2 :(得分:0)
因为您将在try {}
语句中途停止执行。在finally
中,您可能会担心关闭文件句柄,套接字等。
答案 3 :(得分:0)
我们几乎从不捕捉(或应该捕捉)Exception
。我们将捕获Exception
的子类。在这种情况下,如果doSomething()
抛出了catch子句未处理的异常,则doSomethingInFinally()
将不会在第二个示例中执行。
答案 4 :(得分:0)
来自Java文档:
这确保即使出现意外也会执行finally块 异常发生。
跟进
将清理代码放在finally块中总是一个好习惯, 即使没有预料到例外。
这是一个简单的场景,为什么最终很重要:
LeakableIO i;
try{
i = new LeakableIO();
// do more
}catch(MyException e){
return null;
}
i.close()
我们假设存在错误以便执行return
,您认为在返回后还会调用i.close()
吗?答案是否定的。
答案 5 :(得分:0)
不同之处在于,一种形式可能错过最终的东西。
doSomethingAfter
几乎总是被调用。唯一不会被调用的是doSomethingWithException
抛出异常。
public void test1() {
try {
doSomething();
} catch (Exception e) {
doSomethingWithException();
}
doSomethingAfter();
}
无论发生什么, doSomethingAfter
始终都会被调用。
public void test2() {
try {
doSomething();
} catch (Exception e) {
doSomethingWithException();
} finally {
doSomethingAfter();
}
}
即使return
也没有阻止它。再次doSomethingAfter
将始终被调用。
public void test3() {
try {
doSomething();
} catch (Exception e) {
doSomethingWithException();
return;
} finally {
doSomethingAfter();
}
}
答案 6 :(得分:0)
public int method1()
{
try
{
return 1;
doSomething();
}
catch(Exception e)
{
return 0;
e.printStackTrace();
}
finally
{
System.out.println("Hello user");
}
}
在上面的方法中,将始终打印Hello用户。因为finally块中存在的代码将始终执行。 基本上在JDBC中,finally块用于关闭连接。