catch (Exception e) {} 与 finally {}

catch (Exception e) {} vs finally {}

我正在尝试理解和使用异常。

为什么要用finally?除了 finally,我还可以执行 catch(Exception e){}。这样我的程序永远不会崩溃,并且始终执行 catch 之后的代码。 此外,我可以在 try 和 catch 之后添加一个 if/else 来检查是否抛出了异常。这样我的程序就永远不会崩溃,并且 if/else 会创建一个标准行为。

例如伪代码:

public void enterAndPrintANumber() {

boolean exception = false;
int number = 0;

try { 

System.out.println("Please enter a Number")
number = BufferedReader.readLine();

} catch(NumberFormatException e) {

System.out.println("Please enter a number")

}
 catch(Exception e) {

 System.out.println("An error has occurred")
 exception = true;

}

if(exception) {

System.out.println("Action will be restarted")
this.enterAndPrintANumber();

 } else {

 System.out.println("Your Number is "+number)

 }
}


好的...... 对于catch:只有在执行代码时出现异常才会执行catch。这是为了使代码在意外情况下也能正常工作。您显然不希望以意想不到的方式崩溃和停止您的代码。

最后:假设您正在使用数据库。现在,无论是否发生崩溃,在完成必要的处理后关闭数据库连接确实是一个好习惯。另一个例子可能是文件系统。如果您正在处理文件并且无论是否发生崩溃,您可能总是希望在完成工作或处理后关闭文件流。你可能会问为什么?

好吧,这个答案解释得很好:

所以,无论是否发生崩溃,finally 显然都会被执行。在最后一个块中,您将以优雅的方式关闭与数据库、文件流等的连接。

简而言之try/catch/finally被解释为你想尝试的代码,如果出现问题该怎么办,最后是清理代码。 finally 块最常见的用途是关闭您已使用完的资源。所以你可以有一个像这样的块:

Reader reader = null;
try {
  reader = new StringReader("test");
  //do stuff with reader
} catch (Exception e) {
   //print the exception, log it, do something.
} finally {
   reader.close()
}

现在,由于添加了自动关闭 AutoClosable 接口的 Try With Resources 结构,此用例已基本弃用。

另一个用例是,如果您使用诸如信号量之类的东西来进行同步。在您的 try{} 块中,您将获取()信号量,而在您的 finally 块中,您将释放它。