SCJP - override method with exception handling raises a compiler error

我只是一个虾纸丫 提交于 2019-12-02 06:19:09

The compiler doesn't know the real type of the object referenced. It only checks that assignments are valid.

The call to a.eat causes a compile error because the compiler doesn't know the Animal referenced by a is a Dog2. It is deciding whether a checked exception can be thrown based solely on the type of the variable referencing the Dog2.

The compiler is not smart. It does not run the code and it does not keep track of the actual class of the object assigned to the variable a.

Just as when you refer to an object with the type of its superclass you won't see methods specific to the subclass, you also see the throws-clause of the superclass, not that of the subclass's method.

If you add a cast to the subclass in the last line:

((Dog2)a).eat();

then you won't get the unreported exception compile error.

When you look at the code, you can realize: when the object you invoke eat() on is

  • a Dog, then the call will not throw an exception
  • an Animal, then that call could throw

Because of that, the second usage results in the compiler complaining to you.

Overriding a method and to reduce the throws signature is perfectly fine. A caller that knows how to deal with an exception for sure works when a sub class never throws.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!