Executor
глотает исключения, отличные от IOException
. Поймать Throwable
вместо просто IOException
.
Сбой Executor
происходит, когда он сталкивается с каким-то исключением, кроме IOException. Виртуальная машина все еще жива, но Executor
не удалось.
Вот некоторый код, который можно попробовать:
try
{
System.out.println(str);
Files.write(path, (str + System.lineSeparator()).getBytes(), StandardOpenOption.APPEND);
if(new Random().nextBoolean()) {
System.out.println("Here we go.");
throw new RuntimeException("Uncaught");
}
} catch (IOException e) {
e.printStackTrace();
} catch(Throwable t) {
t.printStackTrace();
System.out.println("The show must go on...");
}
Обратите внимание, как я даю 50/50 шанс на создание неперехваченного исключения послезапись (только для быстрого отказа). Если вы удалите второй catch
, он просто прекратит печать. С catch
получается:
12:46:00.780250700: still alive after 0 times.
12:46:05.706355500: still alive after 1 times.
Here we go.
java.lang.RuntimeException:
Uncaught at
KeepaTokenRecorder$FileWritingClass$1.run(KeepaTokenRecorder.java:89)
at [...]
The show must go on...
12:46:15.705899200: still alive after 3 times.