2016-07-15 9 views
0
public class UnrechableCode { 
     public static void main (String args[]) 
     { 
      UnrechableCode uc=new UnrechableCode(); 
      try 
      { 
       System.out.println(1/0); 
      } 
      catch(Exception e) 
      { 
       System.out.print("Inside Catch"); 
       return ; 
      } 
      finally 
      { 
       System.out.println("Inside Finally"); 
       //return; 
      } 
      System.out.println("TEST"); 
     } 
} 

В вышеприведенном коде При удалении инструкции возврата из Catch тогда Заявление после того, как окончательный блок не выполнен, но доступен для парсера. в том же сценарии, если я пишу return в finally block, тот же оператор недостижима парсером, поэтому, если в предыдущем случае оператор доступен для парсера, почему инструкция не выполняется.?Неисправляемый отчет, если возвращаемый отчет в блоке finally

+1

Поскольку у вас есть 'return' в' catch', и ваш код имеет деление на ноль, что приводит к исключению. –

ответ

2

Компилятор Java имеет ограниченную возможность предсказать, может ли какая-либо конкретная строка кода в программе достигать . Этот факт не является ошибкой дизайнеров Java; это подтвержденный факт , что невозможно полностью предсказать поведение всех возможных программ языка общего назначения. Единственный выбор, который могли бы сделать разработчики Java, заключается в том, насколько ограничена эта возможность компилятора должна быть.

См Why does Java have an "unreachable statement" compiler error? для обсуждения, почему компилятор имеет эту способность на всех, почему он считает «недостижимый код» ошибка, и почему некоторые вещи, которые могли бы (относительно легко), были обнаружены в «недостижимого кода «не считаются ошибками« недостижимого кода » компилятором.

В вашем конкретном случае, тот факт, что 1/0 всегда будут бросать исключения, вместе с тем, что есть в catch блоке, который ловит исключение и return, предотвратит выполнение программы из когда-либо писать " TEST "на выход. Но компилятор Java не пытается учитывать исключения, вызванные такими вещами, как 1/0, когда он ищет недостижимый код. Поэтому он действует, как если бы были возможный путь управления, который выполнен в try блок, сделал не сгенерирует исключение (так и не выполнить какой-либо код в catch блоке), затем выполнил finally блок, а затем код после блока finally.

Одна из вещей, что компилятор действительно считают является то, что finally блок будет всегда выполнять перед кодом, который следует за ним, и что если есть return в finally блоке, код после return не будет выполняться вообще. Поэтому a return в блоке finally сделает код после его недостижимости.

TL; DR: В одном случае оператор «TEST» недостижим по причинам, компилятор Java предназначен для признает; в другом случае оператор TEST недоступен по причинам, что компилятор Java - , а не, предназначенный для распознавания.

+0

Компилятор Показывает свое ограничение таким образом, которое отличается для двух случаев. Когда я пишу оператор return в блоке catch, оператор TEST доступен (No Compile Time Error.), но он не выполняется, и когда я вернусь, наконец, оператор TEST даже не достигнут (ошибка времени компиляции). Итак, почему компилятор показывает два разных сценария для одного и того же оператора возврата и как он прогнозирует соответствующий сценарий для данных случаев. –

+0

Что вы подразумеваете под «тем же возвратным заявлением»? У вас есть два разных места в коде, где вы указываете операторы return. Помещение 'return' в одном месте - это не то же самое, что положить« возврат »в другое место, и вы должны ожидать, что у них _might_ будут разные последствия. Я добавил пошаговую информацию о том, как, вероятно, работает анализ недостижимого кода для каждого из двух возможных операторов 'return'. –

+0

Здесь «То же заявление о возврате» означает, что поведение возвращающего что-то в методе должно всегда нравиться одинаково, но в нашем случае это не так, из-за возврата блока catch, утверждение TEST доступно (но не выполняется, почему?) И из-за окончательного возврата блока, утверждение TEST недоступно, WHY? здесь возвращает оператор, показывающий другое поведение, и это то, что точный (тот же оператор return), о котором я спрашиваю about.please, больше о том, почему значение TEST не печатается, но доступно, когда я пишу return in catch, но в случае, наконец, для того же возвращения TEST-заявление недостижима. –