Компилятор 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 3

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
    }
});