美文网首页
12. Java IO: 异常处理

12. Java IO: 异常处理

作者: kopshome | 来源:发表于2017-11-19 19:32 被阅读0次

    想要查看此教程的目录请点击: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: 异常处理

          本文链接:https://www.haomeiwen.com/subject/bdjuvxtx.html