Win a copy of Learn Spring Security (video course) this week in the Spring forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

overriding doubt

 
geeta vemula
Ranch Hand
Posts: 208
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I got it from
http://www.valoxo.ch/jr/mocks/mock01a.htm

Select three correct statements about the following code.
public class Question20 {
public static void main(String[] args) {
Question20 myref = new Question20Sub();
try{
myref.test();
}catch(Exception e){}
}
void test() throws Exception{
System.out.println("In Question20");
throw new Exception();
}
}
class Question20Sub extends Question20 {
void test() {
System.out.println("In Question20Sub");
}
}


A. The try-catch block that encloses myref.test(); is mandatory for the code to compile.
B. Prints: In Question20
C. Prints: In Question20Sub
D. Method test() in class Question20Sub has no obligation to declare a throws clause.
E. An exception is thrown at runtime.
Ans A,C,D

My doubt is why try-catch block is mandatory because we can also declare main with throws clause.
Ans why does this code compiles, as there is no throws clause in overridding method and also Exception is the clecked Exception
Kindly clear my doubts

Thanks,
Geeta Vemula
 
Anthony Accioly
Greenhorn
Posts: 18
IntelliJ IDE Scala
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hey,

Let's take a look at what is happening both at compiling time and running time.

At compiling time, with the code we are telling the compiler to reference a Question20Sub object by a Question20 variable, so, for the compiler, the method signature for test is . That's why either the try/catch block or something like is needed.

If we had something like
public static void main(String[] args) {
Question20Sub myref = new Question20Sub();

myref.test();

}
the code would compile because the Question20Sub test method signature don't throw any checked exceptions.

As a rule, sub class overridden methods can (but don't have to) throw any of the declared exceptions at it's super class (or sub classes of the exceptions declared at the super class). That means that it is ok for a sub class overriden method to do not declare super class exceptions, but it is not ok for it to declare broader exceptions than those declared at the super class.

When the program runs, the myRef variable in the stack actually points to a Question20Sub object in the heap, and as so, the test method prints "In Question20Sub".

I Hope that clears it out. For further reference take a look at Chapter 5 - Flow Control, Exceptions and Assertions - of Sun Certified Programmer Study Guide by Kathy Sierra and Bert Bates.

Cheers

[ December 29, 2008: Message edited by: Anthony Accioly ]
[ December 29, 2008: Message edited by: Anthony Accioly ]
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic