пункт не бросает - PullRequest
       4

пункт не бросает

3 голосов
/ 11 мая 2011

Эта программа верна и компилируется и запускается. Но почему у метода 'a' нет объявления throws?

class Exception1 {
      public void a() 
        {
            int array[] = new int[5];
            try
            {
                System.out.println("Try");
                array[10]=1;
            }
            catch (Exception e)
            {
               System.out.println("Exception");

                throw e;
            }
            finally
            {
                System.out.println("Finally");
                return;
            }
        }
    public static void main(String[] args) 
        {
            Exception1 e1 = new Exception1();

            try {
                e1.a();
            } 
            catch(ArrayIndexOutOfBoundsException e)
            {
                System.out.println("Catch");
            }
            System.out.println("End of main");
        }
}

Ответы [ 2 ]

4 голосов
/ 11 мая 2011

Проблема в return в блоке finally:

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

Если вы удалите return, то вы заметите, что компилятор не примет код, заявив, что Exception не объявлен как брошенный в метод a().

2 голосов
/ 11 мая 2011

ArrayIndexOutOfBoundsException - это непроверенное исключение, которое означает, что его не нужно ни объявлять, ни перехватывать явно.

Итак, проще говоря. В java вы проверяли и не проверяли исключения (и ошибки, давайте пока оставим их). Установленный флажок расширяет Exception и должен быть объявлен, если выброшен и обработан, если код, возможно, выбрасывает их.

С другой стороны, непроверенное исключение распространяется на RuntimeException, и нет необходимости объявлять их, и вы не обязаны их обрабатывать. NullPointerException в качестве примера. Если вам необходимо обрабатывать их, вам понадобится много попыток перехвата, поскольку NPE может произойти практически на любой строке кода.

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