java中的try(){}语法关闭资源

在jdk7之前,你必须用try{}finally{}在try内使用资源,在finally中关闭资源,不管try中的代码是否正常退出或者异常退出。jdk7之后,你可以不必要写finally语句来关闭资源,只要你在try()的括号内部定义要使用的资源,不用写一大堆finally来关闭资源。

所有实现Closeable的类声明都可以写在里面,最常见于流操作,socket操作,新版的httpclient也可以;需要注意的是,try()的括号中可以写多行声明,并且每个要关的资源对象要实现AutoCloseable接口,语句用分号隔开。

请看例子:

jdk7之前:

 /**
     * 发送 GET 请求(HTTP),无参数
     *
     * @param url
     * @return
     */
    public static String doGet(String url) {
        if (StringUtils.isBlank(url)) {
            return "url不能为空";
        }
        // 创建Httpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 创建http GET请求
        logger.info("url:{}", url);
        HttpGet httpGet = new HttpGet(url);
        // 设置请求和传输超时时间
        httpGet.setConfig(requestConfig);
        // 执行请求
        CloseableHttpResponse response = null;
        String result = "";
        try {
            response = httpclient.execute(httpGet);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == HttpStatus.SC_OK) {
                result = EntityUtils.toString(response.getEntity(), chaset);
                logger.info("HttpGet方式请求成功!返回结果:{}", result);
            } else {
                logger.info("HttpGet方式请求失败!状态码:" + statusCode);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                httpclient.close();//相当于关闭浏览器
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

jdk7之后:

/**
     * 发送 GET 请求(HTTP),无参数
     * @param url
     * @return
     */
    public static String doGet(String url) {
        if (StringUtils.isBlank(url)) {
            return "url不能为空";
        }
        // 创建http GET请求
        logger.info("url:{}", url);
        HttpGet httpGet = new HttpGet(url);
        // 设置请求和传输超时时间
        httpGet.setConfig(requestConfig);
        String result = "";
        try (CloseableHttpClient httpclient = HttpClients.createDefault();// 创建Httpclient对象
             CloseableHttpResponse response = httpclient.execute(httpGet);// 执行请求
        ) {
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == HttpStatus.SC_OK) {
                result = EntityUtils.toString(response.getEntity(), chaset);
                logger.info("HttpGet方式请求成功!返回结果:{}", result);
            } else {
                logger.info("HttpGet方式请求失败!状态码:" + statusCode);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

CloseableHttpClient 和CloseableHttpResponse 都实现了Closeable,而Closeable继承了AutoCloseable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值