Обработка исключения на ввод пользователя в 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 шт):
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
}
