Interview question
What is try-with-resources and why is it preferred over manual resource closing? try-with-resources क्या है और manual resource closing से क्यों बेहतर है?
Answer
try-with-resources automatically closes any resource that implements AutoCloseable when the try block finishes, even if an exception occurs - eliminating the need for manual close() calls in finally.
// OLD WAY - manual resource management, verbose and error-prone
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader('data.txt'));
System.out.println(reader.readLine());
} catch (IOException e) {
System.out.println('Error: ' + e.getMessage());
} finally {
if (reader != null) {
try {
reader.close(); // must remember this, and it can ALSO throw
} catch (IOException e) {
e.printStackTrace();
}
}
}
// MODERN WAY - try-with-resources (Java 7+)
try (BufferedReader reader2 = new BufferedReader(new FileReader('data.txt'))) {
System.out.println(reader2.readLine());
} catch (IOException e) {
System.out.println('Error: ' + e.getMessage());
}
// reader2.close() is called AUTOMATICALLY, even if an exception occurs
// Multiple resources - closed in REVERSE order of declaration
try (
FileInputStream in = new FileInputStream('input.txt');
FileOutputStream out = new FileOutputStream('output.txt')
) {
// use both streams
} // out closed first, then in
// Custom class using try-with-resources - must implement AutoCloseable
class MyResource implements AutoCloseable {
public void use() { System.out.println('Using resource'); }
@Override
public void close() { System.out.println('Resource closed'); }
}
try (MyResource resource = new MyResource()) {
resource.use();
} // close() called automaticallytry-with-resources try block खत्म होने पर AutoCloseable implement करने वाले किसी भी resource को automatically close कर देता है, भले ही exception आए।
// पुराना तरीका - manual resource management
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader('data.txt'));
System.out.println(reader.readLine());
} catch (IOException e) {
System.out.println('Error: ' + e.getMessage());
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// Modern तरीका - try-with-resources (Java 7+)
try (BufferedReader reader2 = new BufferedReader(new FileReader('data.txt'))) {
System.out.println(reader2.readLine());
} catch (IOException e) {
System.out.println('Error: ' + e.getMessage());
}
// close() automatically call होता है
// Multiple resources - reverse order में close होते हैं
try (
FileInputStream in = new FileInputStream('input.txt');
FileOutputStream out = new FileOutputStream('output.txt')
) {
// दोनों streams use करना
}
class MyResource implements AutoCloseable {
public void use() { System.out.println('Resource use हो रहा है'); }
@Override
public void close() { System.out.println('Resource close हुआ'); }
}
try (MyResource resource = new MyResource()) {
resource.use();
}Was this answer clear?