Я хочу перебрать стек. Элемент stacktrace состоит из throwables, getCause() возвращает следующий throwable. Последний вызов getCause() возвращает значение null. (Пример: a → b → null)
Я попытался использовать Stream.iterable(), что приводит к исключению NullPointerException, поскольку элементы в iterable не могут быть нулевыми. Вот короткая демонстрация проблемы:
public void process() {
Throwable b = new Throwable();
Throwable a = new Throwable(b);
Stream.iterate(a, Throwable::getCause).forEach(System.out::println);
}
В настоящее время я использую цикл while для создания коллекции вручную:
public void process() {
Throwable b = new Throwable();
Throwable a = new Throwable(b);
List<Throwable> list = new ArrayList<>();
Throwable element = a;
while (Objects.nonNull(element)) {
list.add(element);
element = element.getCause();
}
list.stream().forEach(System.out::println);
}
Есть ли лучший способ (более короткий, более функциональный) для достижения этого?