Итак, я начал играть с Java 8 потоками/лямбда-выражениями и столкнулся с интересной проблемой, и я не совсем уверен, как ее решить. Итак, вот я, прошу вас о помощи.Java 8 - эффективные конечные переменные, lambdas и try/catch/finally block
Пример кода в вопросе:
public void insertBlankPages(File inputFile, String outputFile, final int OFFSET) {
PDDocument newDocument;
PDDocument oldDocument;
try {
newDocument = createNewDocument();
oldDocument = createOldDocument(inputFile);
List<PDPage> oldPages = getAllPages(oldDocument);
oldPages.stream()
.limit(oldPages.size() - OFFSET)
.forEach(page -> {
newDocument.addPage(page);
newDocument.addPage(new PDPage(page.getMediaBox()));
});
newDocument.save(outputFile);
} catch (IOException e) {
e.printStackTrace();
} catch (COSVisitorException e) {
e.printStackTrace();
} finally {
newDocument.close();
oldDocument.close();
}
}
С выше кода, компилятор жалуется на вызов, чтобы закрыть() в блоке, наконец. Ошибка: «Переменная newDocument, возможно, не была инициализирована». То же самое для oldDocument.
Естественно, я иду вперед и инициализировать переменные следующим образом:
PDDocument newDocument = null;
PDDocument oldDocument = null;
Теперь я получаю ошибку компилятора «Variable используется в лямбда-выражения должно быть эффективно окончательным».
Как это сделать?
Методы createNewDocument и createOldDocument выдают исключение, поэтому вызовы должны быть в блоке try/catch. Мне также нужно закрыть документы в блоке finally.
У меня должна быть возможность обойти эту проблему с помощью try-in-resources. Но мне интересно узнать, есть ли для этого какое-то другое правильное решение.
Спасибо.
Это приведет к исключению NullPointerException, если 'createNewDocument' генерирует исключение. – Thilo
@ Тило так что? это не касается отладки его кода, это отвечает «как я могу справиться с окончательным окончанием». Когда он получит NPE, он выяснит, что ему нужно проверить значение null. Я отредактировал код, чтобы обработать это, хотя – Bohemian
Почему бы просто не сделать его «final» (и использовать try-in-resources)? Кажется, это было сделано специально для подобных случаев. – Thilo