Обработка исключения на ввод пользователя в Java

Не могу продумать грамотное построение конструкции для обработки того, что я в вводе при запуске программы могу указать путь к файлу всё, что угодно, а ошибку он не выкидывает. (запись в файл списков).

case 8:
    System.out.println("Введите путь и имя файла: " + scanner.nextLine());
    String filePath = scanner.nextLine();
    try (FileWriter writer = new FileWriter(filePath)) {
        for (Point line : points) {
            writer.write(line + System.lineSeparator());
        }
        System.out.println("Данные успешно записаны в файл.");
    } catch (IOException e) {
        System.out.println("Ошибка при записи данных в файл: " + e.getMessage());
    }
    
    break;

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Byb

FileWriter выдаст ошибку только в том случае, если имя файла не будет корректным для файловой системы. То есть для того, чтобы было выброшено исключение IOException, имя файла либо должно содержать запрещённые символы типа <, > и прочих, либо являться некорректным путём типа ABC:/text.txt.

Файлы же без расширений - как asd, который вы ввели в качестве теста - это обычные файлы для файловой системы, поэтому ошибка и не возникает.

Вы можете самостоятельно проверить наличие расширения у файла. Сделать это можно по-разному. Например, так:

int lastIndexOf = filePath.lastIndexOf(".");
if (lastIndexOf == -1 || filePath.substring(lastIndexOf + 1).isEmpty()) {
    // something
}

Внутри этого блока if вы можете бросить своё собственное исключение и отлавливать его в try вместе с IOException, или сделать как-то иначе.

Однако это не спасает от сомнительных расширений типа .abcdef. На этот случай можете составить список "разрешённых" расширений файлов:

List<String> extensions = List.of(
    "txt",
    "xml",
    "json"
); // список можно продолжать

Тогда проверку корректности имени файла можно усовершенствовать следующим образом:

int lastIndexOf = filePath.lastIndexOf(".");
if (lastIndexOf == -1 || !extensions.contains(filePath.substring(lastIndexOf + 1))) {
    // something
}
→ Ссылка