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...

🌟 My Journey – From Zero to Senior Java Tech Lead 🌟

 There’s one thing I truly believe… If I can become a Java developer, then anyone in the world can. πŸ’― Sounds crazy? Let me take you back. πŸ•“ Back in 2015… I had zero coding knowledge . Not just that — I had no interest in coding either. But life has its own plans. In 2016, I got a chance to move to Bangalore and joined a Java course at a training center. That’s where it all started — Every day, every session made me feel like: "Ohhh! Even I can be a developer!" That course didn’t just teach Java — it gave me confidence . πŸ§ͺ Two Life-Changing Incidents 1️⃣ The Interview That Wasn't Planned Halfway through my course, I had to urgently travel to Chennai to donate blood to a family member. After that emotional rollercoaster, I found myself reflecting on my skills and the future. The next day, as I was preparing for my move to Bangalore to complete the remaining four months of my course, I randomly thought — "Let me test my skills... let me just see...