第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

BufferedReader關(guān)閉流的問題

BufferedReader關(guān)閉流的問題

慕慕森 2019-03-29 18:15:08
線上代碼,如何正確的關(guān)閉BufferedReader流。我用的JDK1.7原來的代碼如下:public static String httpPostWithJson(String ecUrl, String params) {        try {            // 創(chuàng)建連接            URL url = new URL(ecUrl);            HttpURLConnection connection = (HttpURLConnection) url.openConnection();            connection.setDoOutput(true);            connection.setDoInput(true);            connection.setRequestMethod("POST");            connection.setUseCaches(false);            connection.setInstanceFollowRedirects(true);            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");            connection.connect();            // POST請求            DataOutputStream out = new DataOutputStream(connection.getOutputStream());            out.writeBytes(params);            out.flush();            out.close();            // 讀取響應(yīng)            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));            String lines;            StringBuffer sb = new StringBuffer("");            while ((lines = reader.readLine()) != null) {                lines = new String(lines.getBytes(), "utf-8");                sb.append(lines);            }            // System.out.println(sb);            reader.close();            // 斷開連接            connection.disconnect();            return sb.toString();        } catch (MalformedURLException e) {            logger.error("httpPostWithJsonMalformedURLException error", e);            e.printStackTrace();        } catch (UnsupportedEncodingException e) {            logger.error("httpPostWithJsonUnsupportedEncodingException error", e);            e.printStackTrace();        } catch (IOException e) {            logger.error("httpPostWithJsonIOException error", e);            e.printStackTrace();        }        return null;    }這樣雖然在finally中關(guān)閉了流,但是又要在finally中引入IOException,這樣是不是很麻煩啊關(guān)于關(guān)閉流,還有沒有好的措施或者實(shí)踐經(jīng)驗(yàn)?zāi)??謝謝~~補(bǔ)充:JDK 1.7但是不能用Try-with-resources機(jī)制
查看完整描述

4 回答

?
千巷貓影

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個贊

這個問題其實(shí)無須過多困擾。也沒有必要往JDK1.7的try-with-resources上扯。
首先關(guān)閉資源放在try塊里一定會有問題:資源可能不被關(guān)閉。
所以資源的關(guān)閉應(yīng)該放在finally里,這沒有什么疑問。
至于finally塊里close資源會額外引入IOE,這也是無法避免的。
目前(就我見到過的)絕大多數(shù)代碼里,捕獲IOE后,最多打一條log,更多的是noop,即no operations,do nothing。
close的時候IOE發(fā)生的幾率很小,它應(yīng)該屬于一種操作系統(tǒng)層面的error,選擇忽略它是正確的選擇,畢竟你的系統(tǒng)不能因?yàn)橐粋€資源關(guān)閉錯誤而停止運(yùn)行。況且,如果你硬要捕獲這個IOE,那能做些什么呢。

如果不想在finally塊里引入try-catch,我見過guava的一種關(guān)閉方式,寫個工具方法叫做closeQuietly(),不吵不鬧就挺好。


查看完整回答
反對 回復(fù) 2019-04-21
?
aluckdog

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個贊

可以考慮Java7的try with resource


try (BufferedReader br = ...) {

    //...

} catch (IOException ex) {

    //...

}

參考


查看完整回答
反對 回復(fù) 2019-04-21
?
翻過高山走不出你

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個贊

同意1樓的答案,你補(bǔ)充的問題,也是由于IDE的問題。


另外對于實(shí)現(xiàn)了 AutoCloseable 和 Closeable 接口的資源,最好都使用 try-with-resources結(jié)構(gòu)。


以你的代碼作為例子,省略了一些代碼


try{

    reader.readline();

}catch(IOException e){

    e.printStackTrace();

}finally {

    try {

       reader.close();

    } catch (IOException e) {

       e.printStackTrace();

    }

}

假設(shè) readline 和 close 都發(fā)生io異常,使用 JDK1.7 前的異常捕捉結(jié)構(gòu),只能捕捉到 close 的異常,readline 的異常被抑制了。(因?yàn)?finally 的代碼必須執(zhí)行)


另外一個問題,在 try-with-resources 中資源的 AutoCloseable 的 close 方法什么時候執(zhí)行?


在執(zhí)行完 try 代碼塊的代碼之后就會執(zhí)行(這里不貼實(shí)驗(yàn)代碼了),所以使用 try-with-resources 的結(jié)構(gòu),catch 塊和 finally 塊都是在資源進(jìn)行關(guān)閉之后才會執(zhí)行的。


查看完整回答
反對 回復(fù) 2019-04-21
  • 4 回答
  • 0 關(guān)注
  • 2140 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號