2013-09-04 1 views
3

Раньше я думал, что когда произойдет исключение, все приложение Java будет прекращено. Например, я пишу тестовую функцию для проверки моей идеи.Будет ли исключение Java исключать все приложение Java?

public void test(){ 
    File fileDir=new File(sourceDataDir); 
    if(fileDir.exists()){ 
     File[] files = fileDir.listFiles(); 
     for(int index=0 ; index<files.length ; index++){ 
      System.out.println("index = "+index); 
      File file = files[index]; 
      if(index == 1)//delete a file to cause a FileNotFoundException 
       file.delete(); 
      try { 
       BufferedReader in = new BufferedReader(new FileReader(file)); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

удаляет файл, чтобы вызвать FileNotFoundException вручную. Раньше я думал, что вся заявка прекратится, когда произойдет исключение. Но на самом деле приложение продолжит чтение оставшихся файлов. Итак, мой вопрос: в каком условии исключение приведет к прекращению всего приложения?

ответ

11

Мой вопрос в том, в каком условии исключение приведет к прекращению всего приложения?

Это никогда не будет. Только System.exit() приводит к завершению всей программы (и сбою JVM)

Подумайте об исключении и как мощный break;, который может вырваться из методов. Разрыв может привести к выходу цикла, и если последний цикл в единственном потоке не-демона, программа выйдет. Но это не вызывает его, хотя это может быть последнее, что вы видите перед тем, как программа начнет умирать.

+0

Питер, пожалуйста, проверьте ответ, который я вам предоставил. Я получил нисходящее зрение, и я не знаю, почему. –

+0

Ok Спасибо большое за то, что уложили в это время. Я это рассмотрю. +1 для ответа тоже. Наверное, я пытался предложить то же самое. –

0

No. Exception handlers Явы обрабатывает ненормальное выполнение программы

1

Есть два основных типа исключений:

  • не во время выполнения Исключения

Это означает, что система работает правильно , Вы должны поймать исключение или оно не будет компилироваться. Он никогда не завершит приложение. Если вы все равно хотите завершить работу, вам нужно вызвать System.exit (ERROR_NUMBER) в блоке catch или выбросить исключение во время выполнения.

  • исключения времени выполнения

Указывает системную ошибку (например, сервер расконфигурация приложений). Вам не нужно это ловить. Если вы его не поймаете, оно завершает приложение или если вы пишете приложение J2EE, AS может его обработать и продолжить свое приложение.

+0

На самом деле я только что протестировал его, и RuntimeException не завершится. Скорее, это пузырирует исключение для вызывающих абонентов более высокого уровня (до тех пор, пока вы не проглатываете его в уловке) – Gadam

+0

Я думаю, что если ни один из вызывающих абонентов более высокого уровня не поймает его, процесс завершится (например, NullPointerException). Серверы приложений проглатывают их, поэтому ошибки корпоративного приложения не вызывают сбоев весь сервер JavaEE. –

1

Итак, мой вопрос в том, в каком условии исключение приведет к прекращению действия всего приложения ?

См. docs для получения дополнительной информации об исключениях. Что касается вашей проблемы, FileNotFoundException - это проверенное исключение, которое означает, что вам нужно обработать его. Теперь у вас есть опционам

  1. Поймать FileNotFoundException и ручка (вы можете просто стек печати трассировку и продолжить)
  2. или вы можете бросить его родителю (вызов метода)

В случае 1 ваш Java-процесс будет продолжаться до тех пор, пока он не достигнет конца (при условии отсутствия времени выполнения Исключения/ошибки).

В случае 2, если вы не поймаете FileNotFoundException даже в родительской (вызывающей функции) и просто выбросите его снова и продолжаете это делать, исключение, наконец, попадет в метод main(). Если даже ваш метод main() генерирует это исключение, JVM просто отключится.

Обновление для уточнения ваших комментариев:

Ловля Exception не зависит от того, пойманной ВЗ не Excpetion. Inc ase of uncahed Exception вы все равно можете поймать его и продолжить программу. Но это не рекомендуется, потому что по определению uncached Exception (которое не должно происходить вообще) вы не должны восстанавливаться, если происходит неэксклюзивное исключение.

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

public static void main(String args[]) { 
    try { 
     String s = null; 
     System.out.println(s.length()); 
    } catch (Exception e) { 
     System.out.println("Catch runtime exception but not quite sure what to do with it"); 
    } 

    System.out.println("Reached here even after uncatched Exception"); 
} 

выход

Catch runtime exception but not quite sure what to do with it 
Reached here even after uncatched Exception 

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

+0

Таким образом, только исключенное исключение может привести к тому, что основная функция завершится, правильно? Если это исключенное исключение, то поймать его или нет, становится бессмысленным, поэтому JVM не навязывает нам возможность поймать или выбросить это исключение явно, не так ли? – wuchang

+0

Исключенные исключения - это, как правило, ошибки программирования, которые не должны возникать вообще, если они выполняются правильно (индекс из привязанного, нулевого указателя, класс cast, ...), и поэтому вызывающий/пользователь обычно ничего не может с ними поделать. Даже если исключение проверено одним, и мы просто бросаем его по каждому методу, он в конечном итоге будет распространяться на главный метод, и JVM будет закрыта. –

+0

«Таким образом, только исключенное исключение может привести к прекращению основной функции, верно?» Исключенные исключения исключают, что поток завершается. Хотя на первый взгляд кажется невозможным, что исключение, отличное от RuntimeException или Error, остается неподтвержденным, поскольку компилятор задерживает проверенные исключения, есть способы их создания. Например. устаревший метод 'Thread.stop (Throwable)' позволяет бросать произвольные необъявленные метаданные. Вы также можете изменить метод для объявления проверенного исключения * после *, который был скомпилирован вызывающим. И есть еще несколько угловых случаев. – Holger

6

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

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