12. Java IO: 异常处理

想要查看此教程的目录请点击:Java IO教程目录贴地址


Streams或Readers/Writers在使用过程中需要是可关闭的。这需要调用close()方法。这需要一点儿思考,看下面的代码:

InputStream input = new FileInputStream("c:\\data\\input-text.txt");

int data = input.read();
while(data != -1) {
  //do something with data...
  doSomethingWithData(data);

  data = input.read();
}
input.close();

这段代码看起来很好。但是如果doSomethingWithData()方法抛出异常会发生什么?对的!如果发生异常InputStream就不会被关闭了!

下面的代码避免了这样的问题:

InputStream input = null;

try{
  input = new FileInputStream("c:\\data\\input-text.txt");

  int data = input.read();
  while(data != -1) {
      //do something with data...
      doSomethingWithData(data);

      data = input.read();
  }
}catch(IOException e){
  //do something with e... log, perhaps rethrow etc.
} finally {
  if(input != null) input.close();
}

注意一下现在InputStream是怎么样在finally下关闭的。不管在try代码块中发生了什么,finally中的代码都会被执行。所以InputStream总是会被关闭。

但是close()方法如果抛出异常会发生什么?是说stream已经被关闭了?好吧,你可能要用try-catch去catch住这个异常,像下面这样:

} finally {
  try{
    if(input != null) input.close();
  } catch(IOException e){
    //do something, or ignore.
  }
}

这样嵌套的去处理问题,看起来非常丑陋,尽管解决了问题。这样不优雅的异常处理代码并不够好,他可以在你的代码中重复的传播。如果写代码时候比较匆忙,忘记异常处理该怎么办?

想象一下如果从doSomethingWithData()抛出一个异常,第一个catch捕捉到那个异常,InputStream在finally关闭。但是,如果从input.close()方法抛出一个异常会发生什么?两个异常中的哪一个应该被传播到调用堆栈?

幸运的是,有一个方法解决这个问题。解决的办法是 Exception Handling Templates in Java。创建一个异常处理模板在最后来关闭流。代码一次写完,可以在各处重用。可以在Exception Handling Templates in Java学习更多。

Java 7中Java IO 的异常处理

Java7开始有一个新的异常处理机制叫做“try with resources”,它是一个语法糖。这个异常处理机制特别的地方在于你使用资源时需要在使用后关闭,那么用它可以解决这个问题,例如使用InputStream,OutputStream时等等。想要学习和它更多相关的内容可以去Try With Resources in Java 7

.

.

你可能感兴趣的:(12. Java IO: 异常处理)