Потенциальная утечка ресурсов: «httpclient» не может быть закрыт в этом месте

Получение ошибки, указанной в заголовке, в строке

вернуть ответXML.toString();

HttpClient httpclient = HttpClientBuilder.create().build();
HttpPost httppost = new HttpPost("test");
httppost.setHeader("Authorization", "test");
httppost.setHeader("content-type", "text/html; charset=UTF-8");
try {
        httppost.setEntity(new UrlEncodedFormEntity(NameValuePairs));
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    HttpResponse response = null;
    try {
        response = httpclient.execute(httppost);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    InputStream inputStream = null;
    try {
        inputStream = response.getEntity().getContent();
    } catch (IllegalStateException | IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    BufferedReader bufferReader = new BufferedReader(
            new InputStreamReader(inputStream));

    StringBuffer responseXML = new StringBuffer();
    String line = "";
    try {
        while ((line = bufferReader.readLine()) != null) {
            responseXML.append(line);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        inputStream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println( responseXML.toString());
    return responseXML.toString();

person Myth    schedule 17.07.2018    source источник
comment
Где инициализируется httpClient и можно ли его закрыть автоматически? Здесь можно выполнить попытку с ресурсами: try (HttpClient httpClient = ....) { }   -  person    schedule 17.07.2018
comment
добавлена ​​инициализация httpclient   -  person Myth    schedule 17.07.2018


Ответы (2)


Как уже отмечалось, попытка использования ресурсов должна помочь.

Чтобы использовать попытку с ресурсами, ваш HttpClient должен иметь тип autocloseable: тот, который реализует java.lang.AutoCloseable. Предполагая, что вы используете Apache httpcomponents...

try(CloseableHttpClient httpclient = HttpClientBuilder.create().build()) {
   // note the CloseableHttpClient which allows this to happen.
}

В вашем коде есть и другие возможности для этого шаблона, например, там, где у вас есть буферизованный считыватель.

См. это руководство по использованию ресурсов.

person Community    schedule 17.07.2018

Вы можете использовать try-with-resources : try(HttpClient httpClient = new HttpClient) (или где бы вы ни получали клиент), или вы можете использовать finally, когда вы закрываете htppClient:

finally {
httpClient.close();
}
person Seppl98    schedule 17.07.2018
comment
нет httpClient.close() - person HopeKing; 17.07.2018