Java try catch终于显得毫无意义

时间:2016-05-17 09:27:28

标签: java try-catch-finally

这是一个非常愚蠢的问题,但我不理解catch的结合使用,最后。据我所知,无论是否会引发异常,都会执行catch块之后的代码,为什么要使用

try
{
    doSomething();
}
catch(Exception e)
{
    e.printStackTrace();
}
finally
{
    doSomethingInFinally();
}

而不是

try
{
    doSomething();
}
catch(Exception e)
{
    e.printStackTrace();
}

doSomethingInFinally();

?我总是看到人们使用第一种模式,但我认为这是额外的代码。

7 个答案:

答案 0 :(得分:4)

有些情况下,您的建议无效

  • 根本没有catch语句(如果抛出异常,该方法将不会继续执行)。

  • catch块重新抛出异常。

  • try块中有一个return语句。
  • 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块用于关闭连接。