15
votes

Many times I met the statement that the application should always explicitly close all the resources that it opened.

My approach to programming is rather pragmatic and I don't like to blindly follow any convention that I don't clearly see benefits of. Hence my question.

Let's assume that:

  1. I have a small application
  2. It opens a few resources (e.g. files, database connections, remote streams) and processes it
  3. It works a few minutes and then it exits
  4. Let's say it's in Java (if the language is relevant)

Do I really have to care about closing all the resources that I opened? I guess all the resources I opened will be closed/released when the application/virtual machine exits. Am I right?

If that's true, are there any convincing reasons to care about closing resources in such small, short working application?

UPDATE:

The question is purely hypothetical, but the argument for not caring about that is that I may be just hacking together some quick script and don't want to write any unnecessary code not directly related to the problem at hand: closing resources, doing all this verbose try-catch-finally stuff, handling exceptions that I don't care about etc.

The point of the question is whether there are any practical consequences of not doing it.

3
Let me answer with a question for you: Why should you not care about closing the resources?Simon Forsberg
" guess all the resources I opened will be closed/released when the application/Virtual machine exits." --> My guess is this is not true. If you don't close and VM exits, OS may become responsible for closing those streams/sockets.kosa
In order to get rid of the warnings you'd have to suppress them which is just as much work as .close(). Also it's good form.Andrew_CS
@EJP I get your point. But what I was trying to ask for is if it will make any difference it I will not do it right (if not, then I don't care for doing it right)? But I got great answers that explained me that yes, I will make practical difference.Piotr Sobczyk
@PiotrSobczyk Good question! It's always helpful to understand not just what you should do, but why it's important that you do it. +1.Jon Schneider

3 Answers

13
votes

I guess all the resources I opened will be closed/released when the application/Virtual machine exits.

What happens with a resource which was not regurarly released is out of your control. It may do no harm, or it may do some. It is also highly platform-dependent, so testing on just one won't help.

why should I care about closing these resources in such small, short working application?

The size of the application shouldn't matter. First, applications usually grow; second, if you don't practice doing it the right way, you won't know how to do it when it matters.

11
votes

If you not close the resources ,that may leads to application servers being frequently restarted when resource exhaustion occurs.because operating systems and server applications generally have an upper-bound limit for resources

According to docs

The typical Java application manipulates several types of resources such as files,streams, sockets,and database connections.Such resources must be handled with great care, because they acquire system resources for their operations.Thus, you need to ensure that they get freed even in case of errors.

Indeed, incorrect resource management is a common source of failures in production applications,with the usual pitfalls being database connections and file descriptors remaining opened after an exception has occurred somewhere else in the code.This leads to application servers being frequently restarted when resource exhaustion occurs,because operating systems and server applications generally have an upper-bound limit for resources.

try-with-resources Statement introduced in java 7 for the programmers who hates close statements.

4
votes

Short answer - Yes. For one, it's TERRIBLE coding practice just as it is in every other area of life to not clean up after yourself. For another, you can't predict whether the operating system is going to recognize that the java environment no longer needs the resources and you could end up having locks on files/etc that can't be released without a forced restart.

Always clean up whatever resources you open!

Update regarding your update to the original question - it takes 5 seconds to add a try/catch block to close any open resources, and can prevent you having to spend 5 minutes restarting your computer. Doing it right always saves time in the end. My dad always told me the true lazy person does things right the first time so they don't have to come back and do it again. I just say don't be lazy and do it right. The 5 seconds it takes to write a catch block will never slow down the writing process significantly... the 5 seconds you save by not writing it could slow down your debugging immensely.