Где это исключение поймано и обработано? - PullRequest
1 голос
/ 09 марта 2010

В некотором коде, который я читал, я сталкивался с этим:

    class Someclass
    {
      public static void main(String[] args) throws IOException
      {
        //all other code here......
      }
    }

Если main () генерирует исключение, то в данном случае это IOException, где оно перехватывается и обрабатывается?

EDIT: Это считается плохой практикой? Или это действительно распространенный код в реальном мире?

Ответы [ 3 ]

5 голосов
/ 09 марта 2010

Подробная блок-схема полной обработки необработанных исключений приведена здесь: Как обрабатываются необработанные исключения в Java .

При возникновении необработанного исключения JVM выполняет следующие действия:

  • вызывает специальный закрытый метод dispatchUncaughtException() для класса Thread, в котором происходит исключение;
    • [... который] вызывает метод потока getUncaughtExceptionHandler(), чтобы найти подходящий обработчик необработанных исключений для использования. Обычно это будет родительский поток ThreadGroup, чей метод handleException() по умолчанию выведет трассировку стека.
  • затем завершает поток, в котором произошло исключение.

Поэтому вы можете, если хотите, создать свой собственный обработчик необработанных исключений.

Следует также отметить, что хотя main обычно используется в качестве точки входа в приложение Java, метод аналогичен любым другим методам в том, что его можно также вызывать из других контекстов (например, других main методов, или даже сам по себе рекурсивно!). В этом случае вызывающая сторона может ловить сгенерированные исключения.

public class SelfCatch {
    public static void main(String args[]) throws Exception {
        if (args == null) throw new Exception("Hi there!");
        try {
            main(null);
        } catch (Exception e) {
            System.out.println("Caught: " + e);
        }
        System.out.println("Exiting...");
    }
}

Выход:

Caught: java.lang.Exception: Hi there!
Exiting...
1 голос
/ 09 марта 2010

РЕДАКТИРОВАТЬ: Это считается плохой практикой?Или это действительно распространенный код в реальном мире?

Это было бы в рабочем коде, но при быстром прототипировании или сбивании тестового кода его часто используют быстрее, чем вводить try {...}поймать блок.(если только вы не используете хорошую IDE, такую ​​как Eclipse 3.5, которая имеет функцию «Автоматическая упаковка в try / catch» [автоматическое обнаружение всех без исключения исключений!] ;-))

Или вы уверены, что это не будетвыдается методами, вызываемыми main ().

Но даже перенос в блок try / catch обычно приводит к тому же результату, что и если вы оставите исключение необработанным, если вы просто используете e.printStackTrace () ...

0 голосов
/ 09 марта 2010

В командной строке.

РЕДАКТИРОВАТЬ: точка входа Main. Следовательно, нет другого метода / вызывающей стороны для обработки исключения.

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