исключения потока Java - PullRequest
       1

исключения потока Java

22 голосов
/ 12 июля 2011

Предположим, что поток запускается из основного метода.Что произойдет, если исключение выдается в потоке, но не обрабатывается в потоке?

Возможно ли передать исключение обратно в основной метод?

Ответы [ 6 ]

35 голосов
/ 12 июля 2011

Речь идет о непроверенных исключениях, выбрасываемых из метода Thread.run.По умолчанию вы получите что-то подобное в системной ошибке:

Exception in thread "Thread-0" java.lang.RuntimeException
    at Main$1.run(Main.java:11)
    at java.lang.Thread.run(Thread.java:619)

Это результат printStackTrace для необработанных исключений.Чтобы справиться с этим, вы можете добавить свой собственный UncaughtExceptionHandler:

   Thread t = new Thread(new Runnable(){
        public void run() {
            throw new RuntimeException();
        }       
    });
   t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

        public void uncaughtException(Thread t, Throwable e) {
            System.out.println("exception " + e + " from thread " + t);
        }
    });
    t.start();

Чтобы установить обработчик для всех потоков, используйте статический метод Thread.setDefaultUncaughtExceptionHandler.

5 голосов
/ 12 июля 2011

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

Необработанное исключение приведет к завершению потока.Когда он всплывает на вершину Thread.run(), он будет обработан UncaughtExceptionHandler .По умолчанию это просто выведет трассировку стека на консоль.Сам поток завершится в этот момент - он все равно не может продолжаться, потому что его метод run() завершен.

Так что, если вы хотите, чтобы исключение было повторно вызвано в вашем основном потоке, вы можете определитьUncaughtExceptionHandler, который сделает это (это очень простой интерфейс), а затем вызовет Thread.setUncaughtExceptionHandler в порожденном потоке после его создания, передавая ваш пользовательский обработчик исключений.


Единственная потенциально сложная часть о написанииобработчик определяет, где и как именно вы собираетесь «вставить» объект throwable в ваш основной поток.Это не совсем очевидно, если ваш поток отключен от выполнения каких-либо других действий, и будет сильно зависеть от того, как вы разработали свое приложение и как будет выглядеть его параллельная поддержка.

(Если, с другой стороны,ваш основной поток просто ожидает запуска другого потока, тогда это становится проще, но в этом случае, возможно, ваш основной поток должен отправить задачу в поток ExecutorService и заблокировать в Future, который будет обрабатывать всеэтой проводки / жизненного цикла для вас?)

3 голосов
/ 12 июля 2011

Нет, не может.Когда вы думаете об этом, метод main() мог бы закончиться несколько дней назад.

Любое необработанное исключение из потока передается в поток UncaughtExceptionHandler.Если ничего не определено, он переходит к обработчику группы потоков, если он также не установлен, он переходит к обработчику по умолчанию.

0 голосов
/ 12 июля 2011

Исключение перехватывается UncaughtExceptionHandler .Вы можете перехватить его и распространить обратно в главный поток, если хотите.

0 голосов
/ 12 июля 2011

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

0 голосов
/ 12 июля 2011

Если исключение не обработано try {} catch (Exception e){}, то оно вызывается и вызывается функцией, которая вызвала.

Если это отдельный отдельный поток, вы не можете распространить его на объект, который не является родителем потока

Или какая-то другая информация здесь: Как сгенерировать проверенное исключение из потока Java?

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