Нет выходных данных из исключения - PullRequest
4 голосов
/ 17 марта 2010

Почему этот код не печатает трассировку стека исключений?

public class Playground {

    /**
     * @param args
     */
    public static void main(String[] args) {
        startThread();
    }

    private static void startThread() {
        ScheduledExecutorService timer = Executors
                .newSingleThreadScheduledExecutor();
        Runnable r = new Runnable() {
            int dummyInt = 0;
            boolean dummyBoolean = false;

            @Override
            public void run() {
                dummyInt = Integer.parseInt("AAAA");

                if (dummyBoolean) {
                    dummyBoolean= false;
                } else {
                    dummyBoolean= true;
                }

            }

        };

        timer.scheduleAtFixedRate(r, 0, 100, TimeUnit.MILLISECONDS);

    }

}

Как я могу получить это?

Я бы ожидал увидеть это:

java.lang.NumberFormatException: For input string: "AAAA"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at Playground$1.run(Playground.java:25)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(Unknown Source)
    at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Ответы [ 3 ]

8 голосов
/ 17 марта 2010

Исполнитель, вероятно, устанавливает свой собственный обработчик необработанных исключений в потоке, поэтому трассировка стека не будет выводиться на консоль. Если исключение выдается в Runnable, вы можете получить его из объекта ScheduledFuture, возвращаемого методом scheduleAtFixedRate:

ScheduledFuture<?> future = timer.scheduleAtFixedRate(r, 0, 100, TimeUnit.MILLISECONDS);
try {
    future.get();
} catch (ExecutionException e) {
    Throwable cause = e.getCause();
    cause.printStackTrace();
}
1 голос
/ 17 марта 2010

Служба executor имеет тенденцию проглатывать исключения по некоторым причинам. Это может сделать отладку довольно сложной. Просто добавьте try catch для проверки содержимого вашего метода run следующим образом:

public void run() {
  try
    dummyInt = Integer.parseInt("AAAA");

    if (dummyBoolean) {
      dummyBoolean= false;
    } else {
      dummyBoolean= true;
    }
  } catch (Exception e){
    e.printStackTrace();
  }

}

Вот связанный вопрос.

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

Похожий вопрос дает ответ Необработанные исключения с запланированными исполнителями Java здесь, в StackOverflow.

В основном то, что вы можете прочитать в scheduleAtFixedRate () javadoc :

При любом выполнении задания встречает исключение, последующее казни подавлены

Итак, я бы обобщил, что вы никогда не увидите свои исключения при отправке задач через ScheduledExecutorService.scheduleAtFixedRate().

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