Java resource closing

后端 未结 8 1423
一生所求
一生所求 2021-01-12 00:57

I\'m writing an app that connect to a website and read one line from it. I do it like this:

try{
        URLConnection connection = new URL(\"www.example.com         


        
8条回答
  •  被撕碎了的回忆
    2021-01-12 01:41

    Is it good? I mean, I close the BufferedReader in the last line, but I do not close the InputStreamReader.

    Apart from the fact that it should be done in the finally (so that the close is ensured, even in case of an exception), it's fine. The Java IO classes uses the decorator pattern. The close will be delegated to the underlying streams.

    But it is ugly, because the closing methods can throw exception, so I have to handle or throw it.

    When the close throws an exception, it often just means that the other side has been closed or deleted, which is completely out of your control. You can at highest log or ignore it. In a simple application I would just ignore it. In a mission critical application I would log it, just to be sure.

    In a nut, your code can be rewritten as:

    BufferedReader br = null;
    try {
        URLConnection connection = new URL("www.example.com").openConnection();
        br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String response = br.readLine();
    }catch (Exception e) {
        //exception handling
    }finally{
        if (br != null) try { br.close(); } catch (IOException ignore) {}
    }
    

    In Java 7 there will be automatic resource handling which would made your code as concise as:

    try (BufferedReader br = new InputStreamReader(new URL("www.example.com").openStream())) {
        String response = br.readLine();
    } catch (Exception e) {
        //exception handling
    }
    

    See also:

    • Java IO tutorial
    • C# "using" keyword in Java
    • How to use URLConnection

提交回复
热议问题