一、try-finally语句的基本使用
try { // 可能会抛出异常的代码块 } finally { // 无论是否抛出异常都会执行的代码块 }
在Java中,我们常常需要进行一些清理工作,例如关闭I/O流、释放数据库连接、解除锁定等操作。try-finally语句就是用来实现这一目的的。无论try块中是否引发了异常,finally中的代码块总是会被执行,这通常用于释放资源。
假如我们希望在方法返回前关闭一个I/O流,try-finally语句就可以这样使用:
public static void readFile(String fileName) throws IOException { BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
无论try块代码是否抛出IOException,finally中的close()方法总是会被执行,来保证reader资源得到关闭。
二、try-catch-finally语句的使用
try { // 可能会抛出异常的代码块 } catch (Exception e) { // 异常处理代码块 } finally { // 无论是否抛出异常都会执行的代码块 }
try-catch-finally语句是Java中处理异常的标准方式,catch块用于处理可能会抛出的异常,finally块用于清理资源。如果finally块中也抛出了异常,那么它会覆盖前面的异常,成为最后的抛出异常。
下面是一个简单的例子展示try-catch-finally的使用:
public static void readFile(String fileName) { BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
如果在读取文件过程中抛出了IOException,控制权会跳到catch块中进行异常处理,接着finally块中的close()方法会被调用,来保证reader资源得到关闭。
三、try-catch-finally语句的嵌套使用
try { try { // 可能会抛出异常的代码块1 } catch (Exception e1) { // 异常处理代码块1 } finally { // 无论是否抛出异常都会执行的代码块1 } } catch (Exception e2) { // 异常处理代码块2 } finally { // 无论是否抛出异常都会执行的代码块2 }
try-catch-finally语句可以进行嵌套使用,内层的异常处理会覆盖外层的异常处理。当然,内层finally块的代码总是会被优先执行,因为内层finally块在外层finally块之上。
下面是一个简单的例子展示try-catch-finally的嵌套使用:
public static void readFile(String fileName) { BufferedReader reader = null; try { try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e1) { e1.printStackTrace(); } finally { if (reader != null) { reader.close(); } } } catch (IOException e2) { e2.printStackTrace(); } }
顶层的try-catch语句用于抛出readFile()方法中发生的IOException异常,内部的try-catch-finally语句用于读取文件。当文件读取出现问题时,顶层的IOException异常会被抛出并进行处理,而内部的异常处理代码块会被忽略,但内部的finally块仍然会被优先执行,以保证reader资源的释放。
四、finally块的使用注意事项
finally块虽然是无论是否抛出异常总会执行的代码块,但是在特定情况下,finally块中的代码也有可能不会被执行。下面是一些finally块使用注意事项:
- 如果在try块或catch块中调用了System.exit(),那么finally块将不会执行。
- 如果在try块中存在一个无限循环或者死循环,那么finally块将不会执行。
- 如果在try块中使用了return语句,那么finally块中的语句会在方法返回之前被执行。