0

I have one static HashMap for my entire system which contains some object's references; let's call it myHash. The objects are only instantiated once I needed them such as

private static HashMap<String, lucene.store.Directory> directories;

public static Object getFoo(String key) {
    if (directories == null) {
        directories = new HashMap<String, Directory>();
    }
    if (directories.get(key) == null) {
        directories.put(key, new RAMDirectory());
    }
    return directories.get(key); // warning
}

Now, Eclipse is telling me a warning in the return statement:

Potential resource leak: '<unassigned Closeable value>' may not be closed at this location

Why is eclipse telling me that?

Manu Artero
  • 9,238
  • 6
  • 58
  • 73
  • 1
    Could you provide the `myHash` field declaration? – sp00m May 21 '14 at 09:29
  • And what is `whatever`? If you could turn this into a short but *complete* example demonstrating the problem, it would be a lot easier to help you. – Jon Skeet May 21 '14 at 09:31

1 Answers1

4

Directory is a Closeable that is not closed in the same method it is instantiated in, Eclipse warns you this could create potential resource leaks if not closed somewhere else. In other words, a Closeable instance should always be closed somewhere, whatever error could have been thrown.

Here is the usual way to use a Closeable in Java 7+:

try (Directory dir = new RAMDirectory()) {
    // use dir here, it will be automatically closed at the end of this block.
}
// exception catching omitted

In Java 6-:

Directory dir = null;
try {
    dir = new RAMDirectory();
    // use dir here, it will be automatically closed in the finally block.
} finally {
    if (dir != null) {
        dir.close(); // exception catching omitted
    }
}
sp00m
  • 47,968
  • 31
  • 142
  • 252