При переопределении методов следует помнить, что если переопределяемый метод объявляет список возможных исключений, то переопределяющий метод не может расширять этот список, но может его сужать. Рассмотрим пример:
public class BaseClass{
public void method {) throws lOException {} }
public class LegalOne extends BaseClass { public void method {) throws lOException {} }
public class LegalTwo extends BaseClass { public void method () {} }
public class LegalTree extends BaseClass { public void method ()
throws EOFException.MalformedURLException {} }
public class IllegalOne extends BaseClass { public void method {)
throws lOException,lllegalAccessException {} }
public class lllegalTwo extends BaseClass { public void method () {
throw new ExceptlonO; } }
В данном случае:
• определение класса LegalOne будет корректным, так как переопределение метода method() верное (список ошибок не изменился);
• определение класса LegalTwo будет корректным, так как переопределение метода method() верное (новый метод не может выбрасывать ошибок, а значит, не расширяет список возможныхошибок старого метода);
• определение класса LegalTree будет корректным, так как переопределение метода method() будет верным (новый метод может создавать исключения, которые являются подклассами исключения, возбуждаемого в старом методе, то есть список сузился);
• определение класса llegalOne будет некорректным, так как переопределение метода method() неверно (lllegalAccessException не является подклассом lOException, список расширился);
• определение класса llegalTwo будет некорректным: хотя заголовок methodO объявлен верно (список не расширился), в теле метода бросается исключение, не указанное в throws.
Особые случаи
Во время исполнения кода могут возникать ситуации, которые почти не описаны в литературе.
at experiment.Test.main(Test.java:21) Second exception hadle starck trace
Так как при вторичном возбуждении используется один и тот же объект Exception, стек в обоих случаях будет содержать одну и ту же последовательность вызовов. То есть при повторном возбуждении исключения, если мы используем тот же объект, изменения его параметров не происходит.
Рассмотрим другой пример:
import java.io.*; public class Test {public Test() {}
public static void main(String[] args) { Test test = new Test{);