Skip to main content

return statement cascade inside the java method

Question?

In given code find out the output 

public int divide(int a, int b )
{
      try
      {
          return a/b;
      }
     catch(Exception exception)
     {
          return -10;
     }
     finally
    {
        return -100;
    }
}


=> invoke above method using  statement divide(10,10) what will be the output.

=> output
      -100

=> explanation

    When  execution control comes inside the divide method, then JVM create below stack frames.
     one for try block
     one for catch block
     one for finally block.

In java finally block get executed for every execution of try except System exit or System error.

So you can imagine above code in stack/block at runtime like below.


Divide method metadata

Try block metadata 

Catch block metadata

Finally block metadata


 I/P => divide(10,10)
 execution of above statement as follows.
try block 
 return 10/10;  will result into => return 0 , this result value is set to be return and  is stored in method block/metadata.

then method block is waiting for execution completion of finally block

finally block
 inside  finally block again return metadata is set to -100.
so we have now latest value for return is -100. which need to be return  so output is -100;

Interviewer might tweak you with ArithmeticException but output will be remain same as finally block will override the value of the return variable of a catch and try block every time.






    

Comments

Popular posts from this blog

Intersection of exception in class or interface hierarchy

Question? Q1. Will below program compile? public class ExceptionTestForInterface implements Type3 {   public void f()   {     System. out .println( "Hello World" );   }      public static void main(String[] args )   {     Type3 type = new ExceptionTestForInterface();     type .f();   } } interface Type1 {   void f() throws CloneNotSupportedException; } interface Type2 {      void f() throws InterruptedException;    } interface Type3 extends Type1, Type2{    } Ans => Yes, It will compile and successfully print the "Hello World" Remember The set of checked exceptions that a method can throw is the intersection of the sets of checked exceptions that it is declared to throw in all applicable types.

Method overloading parameter as float, double and wrapper.

Question?  What is the output of below code ?   Other question  will it be compile ? will there be an error at runtime for ambiguity?     public   class  RedHatQuestion {    public   void  printData( float   f )   {     System. out .println( "inside float" );   }       public   void  printData( double   d )   {     System. out .println( "inside double " );   }       public   void  printData(Double  d )   {     System. out .println( "Inside object double" );   }       public   static   void  main(String[]  args ) {     RedHatQuestion  question  =  new  RedHatQuestion();      question .printData(3.1415);   } } It will compile as there is no syntax error. Also there is no runtime exception as there no runtime binding created.  See we have only compile time binding/overloading not overriding. Answer : inside double. Explanation : in java for floating value we have default data type as