java 7 새로운 기능의 Try-with-resources statement

4083 단어 java 기초
try - with-resources 문장은 1~여러 자원을 설명하는try 문장입니다.자원은 이try가 실행된 후에 반드시close를 없애야 하는 대상을 가리킨다. 예를 들어connection,resultset 등이다.try - with-resources 문장은try 문장이 끝날 때 모든 자원을 닫을 수 있도록 합니다.실현java.lang.AutoCloseable 또는 java.io.Closeable의 대상은 모두 자원으로 할 수 있다.
다음은 한 파일에서 첫 줄 텍스트를 읽는 예입니다. BufferedReader 의 실례를 사용해서 데이터를 읽습니다. BufferedReader 는 프로그램이 끝날 때 닫혀야 하는 자원입니다.
static String readFirstLineFromFile(String path) throws IOException {
   try (BufferedReader br = new BufferedReader(new FileReader(path))) {
      return br.readLine();
   }
}

이 예에서 자원은 BufferedReader이고 성명문은try 뒤의 괄호 안에 있다.자바 7 이상 버전에서는 BufferedReader java.lang.AutoCloseable 인터페이스가 있습니다.BufferedReadertry-with-resource 문장에 정의되어 있기 때문에try 코드 블록이 정상적으로 완성되었든 이상이 발생하든 이 BufferedReader의 실례는 닫힙니다.
자바 7 이전 버전에서finally 코드 블록을 사용하여 자원이 닫혔는지 확인할 수 있습니다. (try가 정상적으로 완성되었든 이상이 발생했든)다음은finally를 사용하는 예입니다.
static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
  BufferedReader br = new BufferedReader(new FileReader(path));
  try {
    return br.readLine();
  } finally {
    if (br != null) br.close();
  }
}

 
그러나 이 예에서 만약readLine 방법과close 방법이 모두 이상을 던졌다면 readFirstLineFromFileWithFinallyBlock 방법은finally 코드 블록 안의 이상, 즉close 방법에 나타난 이상만 던졌을 뿐try 코드 블록 안의 이상은 금지되었다.반면readFirstLineFromFile이라는 예에서 try 코드 블록과 try-with-resources 문장에 이상이 발생하면readFirstLineFromFile 방법은try 코드 블록에서 나온 이상을 던져주고try-with-resources에서 던진 이상은 금지된다.자바 7 이상 버전에서는 금지된 이상을 얻을 수 있습니다.
너는 1부터 여러 개의 자원을 성명할 수 있다. 아래의 예를 보아라
public static void writeToFileZipFileContents(String zipFileName, String outputFileName)
    throws java.io.IOException {

    java.nio.charset.Charset charset = java.nio.charset.Charset.forName("US-ASCII");
    java.nio.file.Path outputFilePath = java.nio.file.Paths.get(outputFileName);

    // Open zip file and create output file with try-with-resources statement

    try (
      java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
      java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
    ) {

      // Enumerate each entry

      for (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements();) {

        // Get the entry name and write it to the output file

        String newLine = System.getProperty("line.separator");
        String zipEntryName = ((java.util.zip.ZipEntry)entries.nextElement()).getName() + newLine;
        writer.write(zipEntryName, 0, zipEntryName.length());
      }
    }
  }

 
이 예에서 두 개의 자원이 있는데 자원 사이를 분호로 구분한다.자원이 닫히는 순서는 만들어지는 순서와 상반된다. 즉, writer가 먼저 닫히고, 그 다음은 zf이다.
다음은 try-with-resources 문장을 사용하여 java.sql.Statement 대상을 자동으로 닫습니다.
public static void viewTable(Connection con) throws SQLException {

    String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";

    try (Statement stmt = con.createStatement()) {

      ResultSet rs = stmt.executeQuery(query);

      while (rs.next()) {
        String coffeeName = rs.getString("COF_NAME");
        int supplierID = rs.getInt("SUP_ID");
        float price = rs.getFloat("PRICE");
        int sales = rs.getInt("SALES");
        int total = rs.getInt("TOTAL");
        System.out.println(coffeeName + ", " + supplierID + ", " + price +
                           ", " + sales + ", " + total);
      }

    } catch (SQLException e) {
      JDBCTutorialUtilities.printSQLException(e);
    }
  }

여기java.sql.Statement는 JDBC4.1 이상 API의 일부입니다.
주의: try - with-resources에도catch와finally 문장 블록이 있습니다. 보통try 문장을 사용하는 것과 같습니다.try-with-resources 문장에서catch나finally는 자원이 닫힌 후에 실행됩니다.

좋은 웹페이지 즐겨찾기