Потенциално изтичане на ресурси: „httpclient“ може да не бъде затворен на това място

Получаване на грешката, спомената в заглавието на реда

върнете responseXML.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 и може ли да се затваря автоматично? Може да е възможно да направите опит с ресурси тук: опитайте (HttpClient httpClient = ....) { }   -  person    schedule 17.07.2018
comment
добавена httpclient инициализация   -  person Myth    schedule 17.07.2018


Отговори (2)


Както беше отбелязано, опитайте с ресурси трябва да помогне.

За да използвате опита с ресурси, вашият HttpClient трябва да бъде от тип автоматично затваряне: такъв, който прилага java.lang.AutoCloseable. Ако приемем, че използвате httpcomponents на Apache...

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

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

Вижте този урок за try-with-resources.

person Community    schedule 17.07.2018

Можете да използвате try-with-ressources : try(HttpClient httpClient = new HttpClient) (или където и да вземете клиента) или можете да използвате finally, където затваряте htppClient:

finally {
httpClient.close();
}
person Seppl98    schedule 17.07.2018
comment
няма httpClient.close () - person HopeKing; 17.07.2018