исключение MyExc3 никогда не добавляется в тело соответствующего оператора try - PullRequest
1 голос
/ 15 июня 2019

Я уже видел подобный вопрос, но я не нашел решения, потому что в моем случае функция, помещенная в предложение try, фактически выдает исключение.

    class MyExc1 extends Exception { }
    class MyExc2 extends MyExc1 { }
    class MyExc3 extends MyExc2 { }

    public class A1 {
     public static void main(String [] argv) {
     try {
      m();
     } catch( MyExc3 k ) {
         System.out.print(1);
     } catch( Exception u ) {
     } finally {
        throw( new Exception() );
      }
    }

    static void m() {
      try {
       System.out.print(2);
       throw( new MyExc3() );
    }catch( MyExc3 z ) {
    System.out.print(3);
    }catch( Exception d ) {
       System.out.print(4);
    }finally {
       System.out.print(5);
     }
    }
   }

В моем блоке try,psv main вызывает метод m();, который печатает 2 и вызывает исключение с именем MyExc3.Затем это исключение должно быть обработано catch(MyExcp3 z), который должен напечатать 3 и так далее.Но код на самом деле не компилируется:

исключение MyExc3 никогда не добавляется в тело соответствующего оператора try

Почему это так?

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

finally всегда выполняется после запуска try и catch (если возникает исключение).Таким образом, в этом случае нечего обрабатывать ваше исключение, выброшенное из блока finally.Вы можете решить эту проблему, добавив:

public static void main(String [] argv) throws Exception {
    try {
        m();
    } catch( MyExc3 k ) {
        System.out.print(1);
    } catch( Exception u ) {
    } finally {
        throw( new Exception() );
    }
}

или выполнив это:

public static void main(String [] argv) {
    try {
        m();
    } catch( MyExc3 k ) {
        System.out.print(1);
    } catch( Exception u ) {
    } finally {
        try {
            throw( new Exception() );
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Но, тем не менее, вы получите ошибку компиляции.Это потому, что вы перехватываете исключение MyExc3 в main, где оно не генерируется в main ().Вы бросили исключение MyExc3 в m ().Но вы поймали исключение и в m ().Таким образом, исключение MyExc3 не пришло в main ().Для этого, чтобы сгенерировать исключение MyExc3, нужно добавить следующее:

 static void m() throws MyExc3 {
0 голосов
/ 15 июня 2019

Отсутствует часть throws в сигнатуре метода.

Прежде всего, ваш код (как указано прямо сейчас) не компилируется, потому что ваш main() может выдать Exception, но не объявляет его. Когда вы исправите это, то компилятор сообщит вам, что m() не выдает проверенное исключение класса MyExc3.

Таким образом: добавьте throws Exception к public static void main(...) и то же самое для m():

static void m() throws MyExc3 {

Это точка проверяемого исключения: когда ваш метод использует throw someCheckedExceptionInstance ..., тогда это либо должно быть перехвачено в этом методе, либо метод должен сообщить через throws TheSpecificExceptionType, что он выбрасывает этот проверенный исключение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...