2016-09-23 4 views
1

구아바 라이브러리에서 Closer 유틸리티를 사용하는 방법을 파악하는 데 어려움을 겪고 있습니다. 아래 코드를 참조하십시오.구아바를 올바르게 사용하는 방법

  • 한 것은 IndexWriter 객체 초기화 및 close() 모두에 IOException을 던졌습니다이다. 따라서 finally 및 rethrow 블록의 코드에 밑줄이 그어져 있습니다.
  • 다른 질문은 왜

`

int getDocumentsCount() { 
    Closer closer = Closer.create(); 
    try { 
     IndexWriter iwriter = closer.register(openIndexWriter()); 
     return iwriter.numDocs(); 
    } catch (Throwable e) { 
     logger.error(e, e); 
     return -1; 
    } finally { 
     closer.close(); 
    } 
} 


IndexWriter openIndexWriter() throws IOException { 
    return new IndexWriter(directory, analyzer, false, 
     IndexWriter.MaxFieldLength.UNLIMITED); 
} 
(내가 그 자리에서 사람들을 기록하는 것을 선호) 대신에 다른 예외 타입의 Throwable을 잡으려고하고 난이 오류가 다시 발생해야합니까이다

`

덕분에 많은

(자바 6 붙어) 0

답변

4

Guava's own explanation에서 은 , 예를 사용하면이됩니다. 그들이 Throwable를 잡을과 Closer 인스턴스에서 직접 다시 던지는 것을

public void foo() throws IOException { 
    Closer closer = Closer.create(); 
    try { 
    InputStream in = closer.register(openInputStream()); 
    OutputStream out = closer.register(openOutputStream()); 
    // do stuff with in and out 
    } catch (Throwable e) { // must catch Throwable 
    throw closer.rethrow(e); 
    } finally { 
    closer.close(); 
    } 
} 

참고 :

여기에 자신의 예를 조각입니다.

Throwable이 아닌 이유에 관해서는,의는 Closer해야 오류가 제대로 자원을 닫을 수 있도록 발생한 것을 알고 있기 때문에 IOException 또는 RuntimeException, 그것은 말할 수 있습니다. 모든 것은 적절한 일을하는 것의 문제 일뿐입니다. 제대로 작동하지 않으면 작동 할 수 있지만 보장되지는 않습니다.

당신의 방법은 MyOwnCheckedException을 던질 수있는 경우, 예를 들어, 당신이에있는 있음을 선언하지 :

} catch (Throwable t) { 
    throw closer.rethrow(e, MyOwnCheckedException.class); 
} finally { 
    closer.close(); 
} 

자바 7 예를 들어, 비교를 위해 :

public void foo() throws IOException { 
    try (InputStream in = openInputStream(); 
     OutputStream out = openOutputStream(); 
    // do stuff with in and out 
    } 
} 

을 당신이 Closer을 비교하는 경우 예를 들어 Java 7 예제에서는 메소드 서명에 IOException을 선언해야한다는 것을 알 수 있습니다.

int getDocumentsCount() { 
    try { 
    return doGetDocumentsCount(); 
    } catch (IOException e) { 
    logger.error(e, e); 
    return -1; 
    } 
} 

int doGetDocumentsCount() throws IOException { 
    Closer closer = Closer.create(); 
    try { 
    IndexWriter iwriter = closer.register(openIndexWriter()); 
    return iwriter.numDocs(); 
    } catch (Throwable e) { 
    closer.rethrow(e); 
    } finally { 
    closer.close(); 
    } 
} 
+0

1) 나는했습니다 : 시도-피라미드를 방지하기 위해

int getDocumentsCount() { try { Closer closer = Closer.create(); try { IndexWriter iwriter = closer.register(openIndexWriter()); return iwriter.numDocs(); } catch (Throwable e) { closer.rethrow(e); } finally { closer.close(); } } catch (IOException e) { logger.error(e, e); return -1; } } 

, 나는 다음을 수행 할 것 : 귀하의 경우를 들어


, 이것은 당신이해야 할 것입니다 그들의 모범을 보았습니다. 문제는 close가'IOException'을 던질 수 있기 때문에 finally 블록에서 컴파일 오류가 발생한다는 것입니다. 2) 예외를 제소해야합니까? 내 말은, Closer가 예외를 등록하는 데 어떻게 도움이되는지는 모르겠다. 어쨌든 catch 블록에 잡힌 예외를 되돌려 놓은 것은 더 가깝다. (그래서 실제로 그것을 이미 알고있다.) – d56

+0

아니요, 예외를 "다시 제기 할 필요가 없습니다. ** ** 선언해야합니다. 나는 당신이 던져 질'IOException'을 선언 할 필요가 있음을 보여주는 해답을 채택했다. 'Closer'는'Closeable'을 처리하는 것을 처리한다는 것을 명심하십시오. '클로저 (Closer) '범위 밖에서 예외 처리에 관해서는 아무 말도하지 않습니다. –

+0

감사합니다. 1) 그러나'IOException'을 전혀 던지지 않으려 고합니다.'Closer'가 그것을 처리 할 수 ​​없다는 다소 짜증이 나서, 메소드 시그니처에서 그것을 선언하도록 강요합니다. 2) 내가 이해하지 못하는 이유는 'MyOwnCheckedException'을 다시 시작해야하는 이유입니다. 저 자신의 자원에 의해 던져진 예외를 변환하는 방법일까요? – d56

관련 문제