2017-02-12 3 views
2

Как решаются блоки catch в следующем?Как принято решение, какой блок catch на первом месте?

try{ 
    int a[]=new int[5]; 
    a[5]=30/0; 
} 
catch(ArithmeticException e){System.out.println("task1 is completed");} 
catch(ArrayIndexOutOfBoundsException e){System.out.println("task 2 completed");} 
catch(Exception e){System.out.println("common task completed");} 

Я знаю, что производные классы приходят первым, а базовые классы следуют за ними. Класс ArithmeticException и ArrayIndexOutOfBoundsException приходят из:

java.lang.Exception 
    java.lang.RuntimeException 
     java.lang.ArithmeticException 

и

java.lang.Exception 
    java.lang.RuntimeException 
     java.lang.IndexOutOfBoundsException 
      java.lang.ArrayIndexOutOfBoundsException 

Почему ArithmeticException помещается в первую очередь?

+2

Возможный дубликат [Почему вопрос при заказе исключений?] (Http://stackoverflow.com/questions/15167899/why-does-order-matter-when-catching-exceptions) – shmosel

+1

* «Почему« Арифметическое исключение » помещается первым? »* Нет причин. 'ArithmeticException' и' ArrayIndexOutOfBoundsException' могут быть в любом порядке, если они оба находятся перед «Исключением». – Andreas

ответ

4

Они протестированы в том порядке, в котором вы им предоставляете: первый catch с типом, который является классом исключения или его суперкласса - тот, который используется. Это описано в JLS§14.20.1:

  • Если выполнение try блока завершается преждевременно из-за заброса значение V, то есть выбор:

    • Если во время выполнения тип V является присвоением, совместимым с (§5.2) захватывающим классом исключений любого предложения catch инструкции try, тогда выбирается первое (крайнее левое) предложение catch. Значение V присваивается параметру выбранного catch пункта, а блок этого catch пункта выполняется, а затем есть выбор:

      • Если блок завершается нормально, то try утверждение завершается нормально ,

      • Если по какой-либо причине этот блок завершается внезапно, то оператор try завершает работу по той же причине.

    • Если тип вводного времени V не уступка совместит с catchable классом исключения из любого catch пункта заявления попробовать, то try оператор завершается преждевременно из-за забросом значения V.

Продолжая свой вопрос ...

Почему именно ArithmeticException?

Потому что это то, что хотел сделать автор этого кода. В этом коде не имеет значения, помещается ли сначала catch для ArithmeticException или IndexOutOfBoundsException, потому что это разные ветви в иерархии типов; никакое исключение, которое выбрано, не совместимо с назначением для обоих из них, поэтому не имеет значения, в каком порядке находятся первые два блока catch. третий один, однако, должен быть в конце, так как оба ArithmeticException и IndexOutOfBoundsException являются совместимо с Exception.

0

Я считаю, что это первый, который соответствует не «самому конкретному».

например, если у вас поймать (Exception е) первый, остальные даже не взглянуть в.

+1

этот должен был быть комментарий –

+0

Ну, когда я получаю достаточно репутации, чтобы на самом деле добавить комментарий к исходному вопросу, я это сделаю. Это немного снисходительно, чтобы обвинить кого-то в том, что он не комментирует, когда у них нет представителя. Я должен предоставить ответы, которые сначала получат голоса. –

+1

Я делаю это. Я могу понять твою боль! я просто прокомментировал, чтобы вы могли сделать его более сложным и объяснительным, чтобы он дал ответ. Я бы голосовал, если вы это сделаете! –

0

Это сочетание порядка и типа сопоставления. Выполняется первый блок catch, соответствующий типу исключения.

0

Исключение ArithmetcException не помещается первыми в каком-либо статическом смысле. Поведение, которое вы наблюдаете, в большей степени связано с оценкой выражения присваивания: в задании правая сторона полностью оценивается перед любой из левой стороны.

Итак, попытка деления на ноль - и соответствующее исключение выбрано - до того, как попытается получить доступ к произвольному массиву.

Таким образом, ваш код не будет генерировать исключение, относящееся к доступу к массиву за пределами границ.

0

Вы можете поменять местами указанные уловки и результат будет таким же.

Поскольку не существует прямой иерархическая связь между ArithmeticException и ArrayIndexOutOfBoundsException, это не будет иметь значения. Управление исключениями выполняется линейно из блока try.

Кроме того, убедитесь, что отладочные отпечатки, которые вы выполняете, имеют некоторую семантику внутри них, а не только «задание 1 завершено» ... Игнорируйте приведенный выше оператор, если это всего лишь тестовый фрагмент, а не часть долгосрочного проекта ,

Смежные вопросы