Компилятор Java жаловаться несообщаемого исключение IOException
Я пытаюсь написать метод, который перечисляет все не скрытые файлы в каталоге. Однако, когда я добавляю условие !Files.isHidden(filePath)
, мой код не компилируется, и компилятор возвращает следующую ошибку:
java.lang.RuntimeException: Uncompilable source code - unreported exception
java.io.IOException; must be caught or declared to be thrown
Я попытался поймать IOException
, но компилятор по-прежнему отказывается компилировать мой код. Есть ли что-то вопиюще очевидное, что я упускаю? Код приведен ниже.
try {
Files.walk(Paths.get(root)).forEach(filePath -> {
if (Files.isRegularFile(filePath) && !Files.isHidden(filePath)) {
System.out.println(filePath);
} });
} catch(IOException ex) {
ex.printStackTrace();
} catch(Exception ex) {
ex.printStackTrace();
}
2 ответа:
Лямбда-выражение, переданное в
Iterable#forEach
не разрешается создавать исключение, поэтому вам нужно обработать его там:Files.walk(Paths.get(root)).forEach(filePath -> { try { if (Files.isRegularFile(filePath) && !Files.isHidden(filePath)) { System.out.println(filePath); } } catch (IOException e) { e.printStackTrace(); // Or something more intelligent } });
isHiddenFile()
вызывает исключение IOException, и вы его не ловите. Действительно,forEach()
принимает потребителя в качестве аргумента, иConsumer.accept()
не может выдать ни одного проверяемого исключения. Поэтому вам нужно поймать исключение Внутри лямбда-выражением, переданным вforEach()
:Files.walk(Paths.get(root)).forEach(filePath -> { try { if (Files.isRegularFile(filePath) && !Files.isHidden(filePath)) { System.out.println(filePath); } } catch (IOException e) { // do something here } });