Skip to main content

πŸ’‘Checked Exceptions in Java – The Good, The Bad & The Ugly (With Code Examples & Diagrams)

πŸ“¦ Fun & Relatable Opening

Imagine your friend hands you a mystery box and says “Don’t open it without gloves.” That’s Java giving you a checked exception — it forces you to handle it before it explodes in your face. πŸ˜„

πŸ“œ What is a Checked Exception?

Checked exceptions are checked at compile time by the Java compiler.

πŸ’‘ Examples: IOException, SQLException, ClassNotFoundException



public void readFile(String path) throws IOException {

    Files.readAllLines(Paths.get(path)); // IOException is checked

}

πŸ“Š Diagram: How Checked Exceptions Work

 [Method Call]

      |

      v

 [Throws Checked Exception]

      |

      +--> try { ... } catch(...) { ... }

      |

      +--> declare in method signature with throws


πŸ›  Advantages of Checked Exceptions (With Examples)

1️⃣ Compile-time Safety



public void loadData(String fileName) throws IOException {

    Files.readAllLines(Paths.get(fileName));

}

// Caller must handle IOException

try {

    loadData("data.txt");

} catch (IOException e) {

    System.out.println("File not found, loading defaults...");

}

✅ You’re forced to think about recovery instead of letting the app crash.

2️⃣ Explicit Documentation



public void connectToDb() throws SQLException { ... }

πŸ“œ Without reading docs, you already know database connectivity may fail.

3️⃣ Encourages Recovery



try {

    connectToDb();

} catch (SQLException e) {

    retryConnection();

}

4️⃣ Better API Clarity

πŸ‘€ URL.openStream() clearly throws IOException so you know network issues are possible.


⚠️ Disadvantages of Checked Exceptions (With Examples)

1️⃣ Boilerplate Overload



try { method1(); } catch (IOException e) {}

try { method2(); } catch (SQLException e) {}

try { method3(); } catch (ClassNotFoundException e) {}

πŸ“ Your code turns into a catch block jungle.

2️⃣ Leaks Abstraction



public void processOrder() throws SQLException {

    // Directly exposing database errors to upper layers

}

πŸ•΅️ Now even your UI layer must know about SQLException — tightly coupled.

3️⃣ Encourages Lazy Wrapping



public void doSomething() throws Exception { ... }

πŸ’€ No one knows what’s actually thrown — defeats the whole purpose.

4️⃣ Pain with Lambdas/Streams

πŸ“Œ Checked exceptions don’t work smoothly inside lambdas because functional interfaces don’t declare them. This forces you to wrap or catch them inside the lambda.



// ❌ Compile error

files.forEach(file -> Files.readAllLines(file));

// ✅ Fixed

files.forEach(file -> {

    try {

        Files.readAllLines(file);

    } catch (IOException e) {

        System.out.println("Error reading file: " + file);

    }

});

5️⃣ Inflexible API Evolution

πŸ“Œ Adding a checked exception to an existing method later will break all existing callers.



// Version 1

public void read() { ... }

// Version 2

public void read() throws IOException { ... } // Now all callers must change


πŸ’‘ Try-Catch vs Throws — Your Choice

Checked Exception Found

       |

   [Your Choice]

   /           \

try-catch     throws

πŸ“œ Option 1: Using throws



public void readFile1() throws IOException {

    Files.readAllLines(Paths.get("data.txt"));

}

πŸ“Œ Passes the responsibility to the caller.

πŸ›  Option 2: Using try-catch



public void readFile2() {

    try {

        Files.readAllLines(Paths.get("data.txt"));

    } catch (IOException e) {

        System.out.println("Handled inside method: " + e.getMessage());

    }

}

πŸ“Œ Handles it right away, hiding from the caller.

Golden Rule: Catch if you can recover meaningfully, otherwise throws and let someone else decide.


πŸ˜‚ Wrapping Up

Checked exceptions are like your mom’s warnings before a trip — you can’t leave the house until you acknowledge them. πŸ˜„

What’s your take — are you Team Checked or Team Unchecked? Drop your thoughts below ⬇️

Comments

Popular posts from this blog

🐱 Tomcat vs ⚡ Netty – Which One Should You Use?

🐱 Tomcat vs ⚡ Netty – Which One Should You Use? So recently I got curious about this too πŸ€”. Everywhere in Spring Boot tutorials we see Tomcat . Then suddenly while exploring Spring WebFlux , the name Netty pops up. And I was like – “Wait, who’s this Netty guy trying to replace Tomcat?” πŸ˜… Let’s break it down with real-time examples , icons , and fun comparisons . 🐱 Tomcat – The Traditional Web Server Type: Servlet Container (blocking I/O) World: Used with Spring MVC Style: Thread-per-request model πŸ‘©‍πŸ’» Pros: Stable, widely used, battle-tested Cons: Struggles with huge concurrent connections πŸ‘‰ Example in real life: Tomcat is like a restaurant with fixed waiters 🍴. - Each customer = one thread/waiter - If too many customers come in at once → waiters run out → customers wait outside πŸšͺ ⚡ Netty – The Reactive Rockstar Type: Asynchronous Event-Driven Network Framework World: Default for Spring WebFlux Style: Event-lo...

🎭 Spring’s Secret: Why @Transactional & Friends Betray You Silently

πŸ’‘ Lesson Learned — Not a Prod Bug, But a Real Pain No, this wasn’t a production outage. Nobody screamed at me. But I sat for 3 hours wondering: “Why the heck is my @Transactional not rolling back!?” 😡‍πŸ’« “Why is Redis cache not working?” 🀯 Turned out, the issue was one silent villain: 🧱 Self-invocation 🀷 What Is @Transactional ? If you're new: @Transactional = Tells Spring to start a DB transaction when a method is called. It’ll commit if everything’s okay. It’ll rollback if something fails. 🧠 Think of it like wrapping your code in: try { beginTransaction(); // your logic commit(); } catch(Exception e) { rollback(); } πŸ•΅️ Real-Life Analogy — The Gateway Community 🏘️ Let me tell you about my society — it has a strict watchman at the gate. Here’s how it works: πŸ›‚ Watchman = Spring Proxy 🏠 Your apartment = Your service class πŸšͺ Your room = A method inside that class πŸƒ Scenario 1: Outsider Visits Your friend from outside...

🧡 Virtual Threads in Java — The Ultimate Guide with Diagrams, Code & Interview Qs!

πŸš€ “How are Virtual Threads different from Thread Pools?” 😡 “Are they OS threads or JVM threads?” πŸ™ƒ “Should I still use CompletableFuture?” 🀯 “How do I even use them in real-time microservices?” 🧠 What are Virtual Threads? Virtual Threads (introduced in Java 21 as stable πŸŽ‰) are lightweight threads managed by the JVM instead of the OS kernel. πŸ‘‰ They look like normal threads, but don’t hog OS resources like traditional threads. 🧠 What is the OS Kernel? πŸ›️ OS Kernel = The Brain of the Operating System It’s the core part of your OS (Windows, Linux, Mac) that: Manages memory 🧠 Schedules threads πŸ•’ Talks to hardware πŸ’» Handles I/O operations πŸ“¨ When you create a traditional thread in Java, the JVM asks the OS Kernel to create a real OS-level thread. πŸ–Ό️ Imagine This... ┌───────────────────────────┐ │ Your Java Application │ └────────────┬──────────────┘ │ ...