2017-12-12 6 views
1

私はcom.google.api.client.http.HttpResponseオブジェクトをクローズしようとしていますを閉じて、私は、Eclipseのエラーを取得する方法com.google.api.client.http.HttpResponseオブジェクトを適切

未処理の例外タイプのIOException

ライン上の

response.disconnect();

ここでは、コードの例です:

HttpRequest request = null; 
HttpResponse response = null; 

try { 
    request = this.buildJsonApiRequest(apiUrl); 
    response = this.execute(request); 
    return response.parseAs(MyClass.class); 
} catch (final IOException e) { 
    throw new DaoException(e); 
} finally { 
    if (response != null) { 
     response.disconnect(); 
    } 
} 

コードはfinallyブロックなしで機能しますが、私は開いているクローズされていない多くの応答オブジェクトが心配です。これを行う適切な方法は何ですか?

+0

私は本当に 'parseAs()' APIメソッドがストリームを閉じるかどうか知りたいです...私はこのメソッドの実装に関する情報を見つけることはできません。 – mhatch

答えて

0

あなたはメソッドがIOExceptionをスロー可能性があり、GoogleのAPIドキュメントによるのでtry-catch block内切断コールを配置する必要があります。

public void disconnect() throws IOException 

それについての詳細を学ぶために、このリンクをクリックしてください:

https://developers.google.com/api-client-library/java/google-http-java-client/reference/1.20.0/com/google/api/client/http/HttpResponse#disconnect()

+0

APIが「応答ストリームが適切に閉じられている場合は、disconnect()を呼び出す必要はありません」と説明しています。しかし、APIは 'parseAs(Class)'がどのように応答ストリームを処理するかについてあまり明確ではありません。 – Izruo

+0

これは、開かれた接続を閉じるために最後に別のtry catchをネストしなければならないということですか?非効率的だと思われます... – mhatch

+0

同意しますが、 'disconnect method'シグネチャはそれを示しています。 – Ele

0

これはEleazar Enriqueへの返答で、切断はtryブロック内にある必要があると回答しました。これは、よりエレガントに書いて再利用可能にする方法の例です。

あなたはautoCloseableが、その後、あなたのコード内でそれがAutoCloseableが接続を閉じます。このような何か

HttpRequest request = this.buildJsonApiRequest(apiUrl); 

try (HttpResponseHandler handler = new HttpResponseHandler(this.execute(request)) { 
    return handler.parseAs(MyClass.class); 
} catch (final IOException e) { 
    throw new DaoException(e); 
} 

だろうしてみてください-とリソース

public class HttpResponseHandler implements AutoCloseable { 
    private HttpResponse response; 
    public HttpResponseHandler(HttpResponse response) { 
     this.response = response; 
    } 
} 

public <T> T parseAs(Class<T> clazz) throws IOException { 
    return response.parseAs(clazz); 
} 

@Override 
public void close() { 
    if (response != null) { 
     try { 
      response.disconnect(); 
     } catch (IOException ex) {} 
    } 
} 

に使用実装ハンドラクラスを作成することができますあなたのために、finallyブロックでそれを処理する必要はありません。

関連する問題