java try finally block to close stream

前端 未结 8 835
时光取名叫无心
时光取名叫无心 2020-12-05 17:25

I want to close my stream in the finally block, but it throws an IOException so it seems like I have to nest another try block in my finally<

相关标签:
8条回答
  • 2020-12-05 17:44

    Yes it is clunky, ugly and confusing. One possible solution is to use Commons IO which offers a closeQuietly method.

    There's a number of questions in the "Related" column on the right hand of this page that are actually duplicates, I advise to look through these for some other ways of dealing with this issue.

    0 讨论(0)
  • 2020-12-05 17:44

    Your approach within finally is correct. If the code that you call in a finally block can possibly throw an exception, make sure that you either handle it, or log it. Never let it bubble out of the finally block.

    Within the catch block you are swallowing the exception - which is not correct.

    Thanks...

    0 讨论(0)
  • 2020-12-05 17:48

    In Java 7 you can do this...

    try (BufferedReader r = new BufferedReader(...)){
         String inLine;
         while ((inLine = r.readLine()) != null) {
              System.out.println(inLine);
         }
    } catch(IOException e) {
       //handle exception
    }
    
    • Declaring a variable in the try block requires that it implements AutoCloseable.
    • Declaring a variable in the try block also limits its scope to the try block.
    • Any variable declared in the try block will automatically have close() called when the try block exits.

    It's called a Try with resources statement.

    0 讨论(0)
  • 2020-12-05 17:49
    public void enumerateBar() throws SQLException {
        Statement statement = null;
        ResultSet resultSet = null;
        Connection connection = getConnection();
        try {
            statement = connection.createStatement();
            resultSet = statement.executeQuery("SELECT * FROM Bar");
            // Use resultSet
        }
        finally {
            try {
                if (resultSet != null)
                    resultSet.close();
            }
            finally {
                try {
                    if (statement != null)
                        statement.close();
                }
                finally {
                    connection.close();
                }
            }
        }
    }
    
    private Connection getConnection() {
        return null;
    }
    

    source. This sample was useful for me.

    0 讨论(0)
  • 2020-12-05 17:50

    Also if you're using Java 7, you can use a try-with-resources statement:

    try(BufferedReader r = new BufferedReader(new InputStreamReader(address.openStream()))) {
        String inLine;
        while ((inLine = r.readLine()) != null) {
            System.out.println(inLine);
        }
    } catch(IOException readException) {
        readException.printStackTrace();
    }           
    
    0 讨论(0)
  • 2020-12-05 17:53

    It seems a bit clunky.

    It is. At least java7's try with resources fixes that.

    Pre java7 you can make a closeStream function that swallows it:

    public void closeStream(Closeable s){
        try{
            if(s!=null)s.close();
        }catch(IOException e){
            //Log or rethrow as unchecked (like RuntimException) ;)
        }
    }
    

    Or put the try...finally inside the try catch:

    try{
        BufferedReader r = new BufferedReader(new InputStreamReader(address.openStream()));
        try{
    
            String inLine;
            while ((inLine = r.readLine()) != null) {
                System.out.println(inLine);
            }
        }finally{
            r.close();
        }
    }catch(IOException e){
        e.printStackTrace();
    }
    

    It's more verbose and an exception in the finally will hide one in the try but it's semantically closer to the try-with-resources introduced in Java 7.

    0 讨论(0)
提交回复
热议问题