eine interessante Frage
es verhält sich folgendermaßen: eine Unterklasse (abgeleitet) darf überschriebene Methoden enthalten, die weniger oder keine Exceptions schmeißt, andersrum geht das nicht: soll eine Unterklasse eine überschriebene Methode enthalten, die in der Oberklasse z.B. keinen modifier "throws" enthält, darf sie ebenfalls keine Exceptions "throwen". Ein Verstoß gegen diese Regel wird der Compiler nicht akzeptieren.
Das ganze gilt genauso für Interfaces.
Das ganze kann man sich logisch anhand von Polymorphie erklären. Nehmen wir als Beispiel die abstrakte Oberklasse Auto und die davon abgeleitete Klasse Audi. Nun haben wir noch ein Array vom Typ Auto, in dem sich Instanzen von Audis befinden.
Positivbeispiel: Autos haben die Methode "... abstract fahren() throws Exception", es kann also was schiefgehen. Möchten wir nun diese Methode auf die Autos im Array ausführen, müssen wir die mögliche Ausnahme behandeln, auch wenn die implementierte Methode in Audi keine Exception mehr schmeißt "... fahren()". In diesem Fall gehen wir also davon aus, dass die Methode fahren() bei Autos zu Problemen führen KANN, aber eine spezialisierte Klasse diese Methode so implementiert, dass gar kein Fehler mehr entsteht. Des weiteren könnte man sich vorstellen, dass eine spezialisierte Klasse "VW" die Methode "fahren() throws Exception" hat, was kein Problem darstellt, wenn wir allgemein Instanzen von "Auto" behandeln, denn wir fangen mögliche Ausnahmen ab. (Hoffe, es ist bis hierhin nicht zu verwirrend).
Negativbeispiel:
Die abstrakte Klasse "Auto" hat die Methode "abstract fahren()", die keine Exception schmeißt, also kein "throws". Wenn die spezielle Klasse "Audi" wieder die Methode "fahren()" ohne "throws" implementiert, haben wir kein Problem. Haben wir aber wieder die spezielle Klasse "VW", die die Methode "fahren() throws Exception" implementiert, sehen wir die potentielle Exception bei der allgemeinen Klasse "Auto" nicht mehr. Führen wir also "fahren()" auf eine VW-Instanz aus, die in einer Auto-Variable (oder auch Array) steckt, sehen wir hier nicht, dass "fahren()" auch eine Exception schmeißen kann. Kommt es dann zur Ausnahme, sind wir nicht vorbereitet und es knallt.
Die Behandlung von Exceptions können wir uns nur dann ersparen, wenn wir wissen, dass die Auto-Instanz tatsächlich ein Audi ist, der bei "fahren()" keine Exceptions schmeißt, d.h. die Instanz des Audis ist einer Variable vom Typ Audi zugewiesen (klappt natürlich nur beim Positivbeispiel).
Wie gesagt, ich hoffe, das ist irgendwie rübergekommen. Ansonsten kann ich auch noch zwei Code-Beispiele basteln.