← Back to Questions
Java

What is finally block in Java?

Learn What is finally block in Java? with simple explanations, real-time examples, interview tips and practical use cases.

The finally block in Java is a block used in exception handling that always executes whether an exception occurs or not.

In simple words:

finally block is used to execute important cleanup code after try-catch execution.


Why finally Block is Important?

The finally block helps:

  • Close database connections
  • Release resources
  • Close files
  • Perform cleanup operations
  • Ensure critical code execution

finally Block Syntax

try {

    // risky code

}
catch(Exception e) {

    // exception handling

}
finally {

    // cleanup code

}

finally Block Execution Flow


try Block Executes

      |
      +-------> Exception Occurs
      |               |
      |               v
      |          catch Block Executes
      |
      v

finally Block Always Executes


Basic Example

class Test {

    public static void main(String[] args) {

        try {

            int result = 10 / 0;

        }
        catch(Exception e) {

            System.out.println(
                "Exception Handled"
            );

        }
        finally {

            System.out.println(
                "finally Block Executed"
            );

        }

    }

}

Output


Exception Handled

finally Block Executed


Why finally Block Executes?

Because finally block is designed for guaranteed execution of cleanup logic.


Example Without Exception

class Test {

    public static void main(String[] args) {

        try {

            System.out.println("Try Block");

        }
        catch(Exception e) {

            System.out.println("Catch Block");

        }
        finally {

            System.out.println("finally Block");

        }

    }

}

Output


Try Block

finally Block


Observation

finally block executes even when no exception occurs.


finally Block Internal Working


try Block Starts

      |
      +-------> Exception?
              |
      +-------> Yes → catch Block
      |
      +-------> No → Continue

      |
      v

finally Block Executes


Can finally Exist Without catch?

Yes.


Example

try {

    System.out.println("Try");

}
finally {

    System.out.println("finally");

}

Output


Try

finally


Can finally Exist Without try?

No. finally block must always be associated with try block.


Invalid Example

finally {

    System.out.println("Invalid");

}

Compiler Error Reason

finally cannot exist independently.


When finally Block May Not Execute?

finally block may not execute in rare situations:

  • System.exit()
  • JVM crash
  • Power failure
  • Infinite loop before finally

Example Using System.exit()

try {

    System.exit(0);

}
finally {

    System.out.println("finally");

}

Output

No output from finally block.


Why?

JVM terminates immediately.


finally Block with return Statement

finally executes even when return statement exists.


Example

class Test {

    static int test() {

        try {

            return 10;

        }
        finally {

            System.out.println(
                "finally Executed"
            );

        }

    }

}

Output


finally Executed


Execution Flow with return


try Block

      |
      v

return Statement Encountered

      |
      v

finally Executes First

      |
      v

Method Returns Value


finally Block for Resource Cleanup

finally block is commonly used for:

  • Closing files
  • Closing database connections
  • Closing sockets
  • Releasing resources

Database Connection Example

Connection con = null;

try {

    con = DriverManager.getConnection(
        "jdbc:mysql://localhost/test"
    );

}
catch(Exception e) {

    e.printStackTrace();

}
finally {

    if(con != null) {

        con.close();

    }

}

Why Resource Cleanup is Important?

Without cleanup:

  • Memory leaks occur
  • Database connections exhaust
  • Application performance decreases

finally Block in Banking Systems

Banking applications use finally block for:

  • Closing transactions
  • Releasing locks
  • Audit logging
  • Connection cleanup

Example

finally {

    transaction.close();

}

finally Block in E-Commerce Systems

E-commerce systems use finally block for:

  • Payment session cleanup
  • Inventory lock release
  • File upload cleanup
  • Order processing cleanup

finally Block in Spring Boot

Spring Boot applications use finally block for:

  • Closing streams
  • Cleaning temporary files
  • Thread cleanup
  • Connection handling

Modern Alternative: try-with-resources

Java provides:

try-with-resources

to simplify resource cleanup.


Example

try(
    BufferedReader br =
        new BufferedReader(
            new FileReader("test.txt")
        )
) {

    System.out.println(br.readLine());

}
catch(Exception e) {

    e.printStackTrace();

}

Why Better?

  • Automatic resource closing
  • Cleaner code
  • Less boilerplate
  • Reduced memory leaks

Difference Between final, finally, and finalize

Feature final finally finalize()
Type Keyword Block Method
Purpose Restriction Cleanup Code Garbage Collection
Used In Variables/Methods/Classes Exception Handling Object Cleanup

finally Block vs finalize()

Feature finally Block finalize() Method
Purpose Resource Cleanup Garbage Collection Cleanup
Execution Guaranteed Normally Not Guaranteed
Called By Program Flow Garbage Collector

finally Block in Microservices

Microservices architectures use finally block for:

  • Connection cleanup
  • Distributed lock release
  • Logging cleanup
  • Temporary resource handling

finally Block Memory Flow


try Block Allocates Resources

      |
      v

Exception Occurs or Not

      |
      v

finally Block Releases Resources


Advantages of finally Block

  • Ensures cleanup execution
  • Prevents resource leaks
  • Improves application stability
  • Supports reliable exception handling

Disadvantages of finally Block

  • Complex nested try-finally reduces readability
  • Modern Java prefers try-with-resources

Common Interview Mistake

Many developers think finally executes only when exception occurs.

Actually:

  • finally executes whether exception occurs or not.

Another Common Mistake

Many developers think finally always executes in every situation.

Actually:

  • System.exit() and JVM crashes can prevent finally execution.

Best Practices

  • Use finally for cleanup operations
  • Prefer try-with-resources for streams/files
  • Keep finally block lightweight
  • Avoid business logic inside finally

Realtime Enterprise Example

Payment Gateway Processing

finally {

    paymentSession.close();

}

Ensures payment session closes properly even if transaction fails.


Related Learning Topics


Professional Interview Answer

The finally block in Java is used in exception handling to execute important cleanup code regardless of whether an exception occurs or not. It is commonly used for releasing resources such as database connections, file streams, sockets, and locks. The finally block always executes after try and catch blocks except in rare situations like JVM termination using System.exit(). Modern enterprise applications, Spring Boot frameworks, banking systems, and cloud-native microservices use finally blocks and try-with-resources extensively for reliable resource management and application stability.


Frequently Asked Questions

What is finally block in Java?

finally block is used to execute cleanup code after try-catch execution.

Does finally always execute?

Normally yes, except in cases like System.exit() or JVM crash.

Can finally exist without catch?

Yes, finally can exist with try block only.

Why is finally block used?

It is used for resource cleanup and guaranteed code execution.

What is better than finally for resource cleanup?

try-with-resources is the modern preferred approach.

Why this Java question is important?

This interview question helps candidates understand real-time backend development concepts, practical problem solving, coding fundamentals, system design basics and production-ready application behavior.

Practice this question carefully for Java backend roles, Spring Boot developer interviews, microservices interviews, company interviews and full-stack developer preparation.

About the Author

Naresh Kumar is a Senior Java Backend Engineer with experience building enterprise applications using Java, Spring Boot, Microservices, Docker, Kubernetes and Cloud technologies.