2013-08-05 5 views
2

Непосредственно из этого jls:Разъяснение о точке JLS

Заявление примерочных с-ресурсами с пунктом ResourceSpecification, объявляющего множество ресурсов рассматривается как если бы оно было кратно примерочных с-ресурсами операторы, каждая из которых имеет предложение ResourceSpecification, которое объявляет один ресурс. Когда перевод строки с использованием n ресурсов (n> 1), , результат представляет собой запрос try-with-resources с ресурсами n-1. После n таких переводов есть n вложенных утверждений try-catch-finally, и полный перевод завершен.

Для меня очень примечательна последняя часть вышеуказанного заявления. Почему, если я объявил n ресурсов, то, как говорится, the result is a try-with-resources statement with n-1 Resources?

Почему не с русскими ресурсами?

Заранее спасибо.

ответ

1

Это более-менее объяснено в Better Resource Management with Java SE 7: Beyond Syntactic Sugar. Возьмите этот фрагмент кода, например:

try(
    FileInputStream fin = new FileInputStream(input); 
    FileOutputStream fout = new FileOutputStream(output); 
    GZIPOutputStream out = new GZIPOutputStream(fout) 
) { 
    // ... do work 
} 

Это было бы равносильно следующему:

FileInputStream localFileInputStream = new FileInputStream(paramString1); 
Object localObject1 = null; 
try { 
    FileOutputStream localFileOutputStream = new FileOutputStream(paramString2); 
    Object localObject2 = null; 
    try { 
     GZIPOutputStream localGZIPOutputStream = new GZIPOutputStream(localFileOutputStream); 
     Object localObject3 = null; 
      try { 
       // ... do work 
      } catch (Throwable localThrowable6) { 
       localObject3 = localThrowable6; 
       throw localThrowable6; 
      } finally { 
       if (localGZIPOutputStream != null) { 
        if (localObject3 != null) { 
         try { 
          localGZIPOutputStream.close(); 
         } catch (Throwable localThrowable7) { 
          localObject3.addSuppressed(localThrowable7); 
         } 
        } else { 
         localGZIPOutputStream.close(); 
        } 
       } 
      } 
     } catch (Throwable localThrowable4) { 
      localObject2 = localThrowable4; 
      throw localThrowable4; 
     } finally { 
      if (localFileOutputStream != null) { 
       if (localObject2 != null) { 
        try { 
         localFileOutputStream.close(); 
        } catch (Throwable localThrowable8) { 
         localObject2.addSuppressed(localThrowable8); 
        } 
       } else { 
        localFileOutputStream.close(); 
       } 
      } 
     } 
    } catch (Throwable localThrowable2) { 
     localObject1 = localThrowable2; 
     throw localThrowable2; 
    } finally { 
     if (localFileInputStream != null) { 
      if (localObject1 != null) { 
       try { 
        localFileInputStream.close(); 
       } catch (Throwable localThrowable9) { 
        localObject1.addSuppressed(localThrowable9); 
       } 
      } else { 
       localFileInputStream.close(); 
      } 
     } 
    } 
} 

Да, это aweful много кода, но, как вы можете видеть, что гнездится каждый try -с -ресурсы блокируются внутри верхнего.

2

Что JLS пытается сказать, что если у вас есть:

try (
    Closable closeable1 = ...; 
    Closable closeable2 = ...; 
    // ... 
    Closable closeablen = ...; 
) { 
    // ... 
} 

Он будет получать несколько раз разложить на:

try (Closable closeable1 = ...) { 
    try (
     Closable closeable2 = ...; 
     // ... 
     Closable closeablen = ...; 
    ) { 
     // ... 
    } 
} 

И это повторяется так больше, поскольку есть несколько ресурсов в try. Это только иллюстрация, поскольку я предполагаю, что она разложена на фактический байт-код, используемый для try-with-resources.

1

Я понимаю, это тот факт, что заявление

try (
    resource 1 
    resource 2 
    resource n 
) { 
} 

переводится рекурсивно n заявления, первый шаг быть с n-1 ресурсов во внутреннем заявлении:

try (
    resource 1 
) { 

    try (// n-1 resources here 
     resource 2 
     resource n 
    ) { 
    } 
} 

Я согласен, что Редакция неясна.

Смежные вопросы