
What are Exceptions?
Definition: Exceptions are runtime anomalies or issues that disrupt the normal flow of program execution.
- Hierarchy of exceptions:
- Throwable (Base class)
- Error (e.g., OutOfMemoryError, StackOverflowError)
- Exception
- Checked Exceptions (e.g., IOException, SQLException)
- Unchecked Exceptions (e.g., NullPointerException, ArithmeticException)
- Throwable (Base class)
Checked vs Unchecked Exceptions
- Checked Exceptions:
- Must be declared in the method signature using throws.
- Example: File handling errors (FileNotFoundException), SQL errors.
- Unchecked Exceptions:
- Occur at runtime, not checked at compile-time.
- Example: NullPointerException, ArrayIndexOutOfBoundsException.
How to Handle Exceptions in Java
The Try-Catch Block
try {
// Code that may throw an exception
} catch (ExceptionType e) {
// Handling code
}
try {
int result = 10 / 0; // This will throw ArithmeticException
} catch (ArithmeticException e) {
System.out.println("Cannot divide by zero: " + e.getMessage());
}
The Finally Block
Ensures that cleanup code (e.g., closing files, releasing resources) is always executed.
try {
FileReader file = new FileReader("test.txt");
} catch (FileNotFoundException e) {
System.out.println("File not found");
} finally {
System.out.println("Closing resources...");
}
The Throws Keyword
Used in method declarations to indicate that the method can throw exceptions.
public void readFile(String fileName) throws IOException {
FileReader file = new FileReader(fileName);
}
The Throw Keyword
Used to explicitly throw an exception.
public void checkAge(int age) {
if (age < 18) {
throw new IllegalArgumentException("Age must be 18 or above");
}
}
Best Practices for Exception Handling
Handle Specific Exceptions: Avoid catching generic Exception or Throwable.
try {
// Code
} catch (IOException e) {
// Handle IO-related errors
} catch (SQLException e) {
// Handle SQL-related errors
}
Use Custom Exceptions: Create user-defined exceptions for better clarity.
public class InvalidUserException extends Exception {
public InvalidUserException(String message) {
super(message);
}
}
Don’t Suppress Exceptions: Avoid empty catch blocks.
// Bad practice
catch (Exception e) {
// Do nothing
}
Don’t Overuse Exceptions: Use them for exceptional cases, not for flow control.
Always Clean Up Resources: Use finally
or try-with-resources.
Don’t Overuse Exceptions: Use them for exceptional cases, not for flow control.
Common Use Cases
File Handling
try (FileReader fr = new FileReader("test.txt")) {
// Read file
} catch (IOException e) {
e.printStackTrace();
}
Database Operations
try {
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
// Execute queries
} catch (SQLException e) {
e.printStackTrace();
}
User Input Validation
public void processUserInput(String input) {
if (input == null || input.isEmpty()) {
throw new IllegalArgumentException("Input cannot be null or empty");
}
}
Network Communication
try {
URL url = new URL("http://example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
} catch (IOException e) {
e.printStackTrace();
}
Multithreading
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Advanced Concepts
Nested Try-Catch Blocks
try {
try {
int[] arr = {1, 2};
System.out.println(arr[2]); // Throws ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Inner catch: " + e.getMessage());
}
} catch (Exception e) {
System.out.println("Outer catch: " + e.getMessage());
}
Chained Exceptions
Useful for wrapping exceptions with additional context
try {
throw new IOException("Database connection failed");
} catch (IOException e) {
throw new RuntimeException("Failed to initialize application", e);
}
Try-With-Resources
Simplifies resource management.
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
Common Mistakes
- Overusing generic Exception in catch blocks.
- Ignoring exception stack traces.
- Using exceptions for normal flow control.
- Missing resource cleanup.
Conclusion
Summarize the importance of exception handling, reiterate best practices, and encourage readers to apply the discussed techniques in their projects. Provide links to related topics, such as Java 8 features or multi-threading, for further learning.