Проверенные непроверенные исключения - PullRequest
7 голосов
/ 10 июля 2009

Рассмотрим следующий код

private int meth()
{
   try
   {
       return 1;
   }
   catch(Exception ex)
   {
       return 2;
   }
   finally
   {
       return 3;
   }
}

Когда вышеупомянутый код компилируется, «Исключение» обрабатывается как непроверенное исключение. То есть «недостижимый блок перехвата. Исключение никогда не генерируется в блоке проб». Ошибка компиляции не возникает. Рассмотрите, я объявляю свое собственное исключение,

class MyException extends Exception
{
}

и используя его в коде

private int meth()
{
   try
   {
      return 1;
   }
   catch(MyException me)
   {
      return 2;
   }
   finally
   {
      return 3;
   }
}

В этом «недостижимом блоке захвата MyException никогда не генерируется в блоке try» происходит ошибка компиляции. Почему в первом сценарии «Исключение» рассматривается как RuntimeException, а во втором сценарии, хотя «MyException» является подклассом «Исключения», оно рассматривается как проверенное исключение. Может кто-нибудь помочь мне решить эту проблему?

Ответы [ 3 ]

12 голосов
/ 10 июля 2009

Причина такого поведения заключается в том, что единственным непроверенным исключением в языке Java является RuntimeException и его подклассы. Все другие исключения и ошибки, в том числе и ваши, поскольку это только подклассы Exception (а не RuntimeException), являются проверенными исключениями.

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

4 голосов
/ 10 июля 2009

Насколько компилятор знает, что вы можете в любой момент получить исключение переполнения стека, исключение нехватки памяти, арифметическое исключение или любое количество других исключений, созданных JVM. С другой стороны, он может статически анализировать этот блок try и видеть, что MyException никогда не выбрасывается, поэтому он поднимает руки вверх. Он знает, что это никогда не будет брошено JVM.

1 голос
/ 10 июля 2009

В Java непроверенные (RuntimeExceptions) и проверенные исключения все являются производными от Exception.

В вашем примере в первом случае блок catch может либо перехватить исключение RuintimeException (здесь вы получаете преимущество сомнения), либо любое проверенное исключение и, следовательно, не жаловаться на то, что исключение не перехвачено.

Однако во втором случае, поскольку вы явно упомянули тип исключения, который является проверенным, и который не добавляется ни в одну часть вашего кода и, следовательно, выдает ошибку. Этот блок catch не применим для RTExceptions. В этом конкретном случае вы не получаете преимущества от сомнений, какой компилятор имел в вашем первом сценарии.

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