2012-07-24 26 views
5

Tôi có Lớp Java sau đây thực hiện một điều, kích hoạt các giá trị từ config.properties.Tôi có cần bao quanh tệpInputStream.close với khối try/catch/finally không? Làm thế nào là nó được thực hiện?

Khi đến lúc đóng fileInputStream, tôi nghĩ rằng tôi đã đọc trên Wikipedia rằng tốt nhất là nên có nó trong một khối cuối cùng. Bởi vì nó thực sự hoạt động tốt trong khối try/catch.

Bạn có thể cho tôi chỉnh sửa để có được fileInputStream.close() trong phần cuối cùng không?

ConfigProperties.java cơ sở gói;

import java.io.FileInputStream; 
import java.util.Properties; 

public class ConfigProperties { 

    public FileInputStream fileInputStream; 
    public String property; 

    public String getConfigProperties(String strProperty) { 

     Properties configProperties = new Properties(); 
     try { 

      fileInputStream = new FileInputStream("resources/config.properties"); 
      configProperties.load(fileInputStream); 
      property = configProperties.getProperty(strProperty); 
      System.out.println("getConfigProperties(" + strProperty + ")"); 

      // use a finally block to close your Stream. 
      // If an exception occurs, do you want the application to shut down? 

     } catch (Exception ex) { 
      // TODO 
      System.out.println("Exception: " + ex); 
     } 
     finally { 
      fileInputStream.close(); 
     } 

     return property; 
    } 
} 

Giải pháp chỉ làm như Eclipse đề xuất và thực hiện điều này trong khối cuối cùng?

finally { 
    try { 
     fileInputStream.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Xin cảm ơn tất cả mọi người!

+1

FYI: commons-io có một chức năng tốt đẹp: IOUtils.closeQuietly() sẽ xử lý việc thử/bắt khi đóng. Mã của bạn sẽ trông đẹp hơn :) Hãy nhớ rằng chức năng này không cung cấp cho bạn cơ hội để trả lời cho IOException, nhưng thường thì mọi người không làm điều đó và bỏ qua ngoại lệ. Nếu bạn cần trả lời, hãy tạo phương thức tiện ích của riêng bạn để ghi lại hoặc in dấu vết ngăn xếp hoặc bất cứ điều gì bạn cần làm. – Matt

Trả lời

7

FileInputStream.close() ném IOException và khối {} cuối cùng không bắt ngoại lệ. Vì vậy, bạn cần phải bắt hoặc khai báo nó để biên dịch. Đề xuất của Eclipse là tốt; bắt IOException bên trong khối {} cuối cùng.

+0

Bạn cũng có thể sử dụng [IOUtils.closeQuietly()] (http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/IOUtils.html#closeQuietly (java.io.Closeable)) từ Commons IO. Nó kết thúc tốt đẹp phương pháp đóng để thả tất cả các IOExceptions được ném ra. Sạch hơn là có một khối try/catch khác. –

11

Có, đó là giải pháp tiền Java 7 phổ biến. Tuy nhiên, với sự ra đời của Java 7, hiện nay có try-with-resource báo cáo đó sẽ tự động đóng bất kỳ tài nguyên tuyên bố khi thoát try khối:

try (FileInputStream fileIn = ...) { 
    // do something 
} // fileIn is closed 
catch (IOException e) { 
    //handle exception 
} 
7

Cách tiếp cận giữa các ý kiến:

FileInputStream fileInputStream = null; 
try { 
    fileInputStream = new FileInputStream(...); 
    // do something with the inputstream 
} catch (IOException e) { 
    // handle an exception 
} finally { // finally blocks are guaranteed to be executed 
    // close() can throw an IOException too, so we got to wrap that too 
    try { 
     if (fileInputStream != null) { 
      fileInputStream.close(); 
     }   
    } catch (IOException e) { 
     // handle an exception, or often we just ignore it 
    } 
} 
Các vấn đề liên quan