Каков наилучший способ обработки исключения для недопустимого файла?
У меня есть класс Java, где пользователь предоставляет путь к файлу, и если путь не существует, я прошу их попробовать еще раз. Мой профессор говорит, что мы должны использовать исключение, чтобы справиться с этим.
Вот фрагмент того, как я сейчас это делаю:
public class SalesUtil {
public static void processSales() {
Scanner keyboard = new Scanner(System.in);
System.out.println("Enter sales file name: ");
String salesFile = keyboard.nextLine();
try {
Scanner scanFile = new Scanner(new File(salesFile));
//do stuff
}
} catch(FileNotFoundException fnfe) {
System.out.println("Invalid file name supplied, please try again.");
processSales();
}
}
}
Хорошо в do stuff
В разделе я вычисляю значения и печатаю данные на консоль. Если я правильно ввожу правильное имя файла с первой попытки, все данные верны. Если он неверен один или несколько раз, данные неверны.
Я полагаю, это из-за добавления вызовов функций поверх моего начального стека и невозможности "выйти" из начального стека при подаче последующих вызовов стека, пока не будет предоставлен правильный файл?
Я все еще новичок в Java и был бы признателен за несколько советов в понимании, как решить эту проблему с помощью исключения.
2 ответа
FileNotFoundException
Правильно ли ловить, однако я понимаю, что вы беспокоитесь о накоплении стеков? Я протестировал чтение файла после нескольких неудачных попыток, и это было нормально. Рекурсивный вызов находится в конце метода, поэтому он является последней строкой кода, и поэтому стеки не должны иметь никакого эффекта.
Однако, если вы хотите, вы можете использовать цикл while вместо рекурсии, чтобы избежать наращивания стека:
public static void processSales() {
Scanner scanFile = null;
Scanner keyboard = new Scanner(System.in);
while (scanFile == null) {
System.out.println("Enter sales file name: ");
String salesFile = keyboard.nextLine();
try {
scanFile = new Scanner(new File(salesFile));
while (scanFile.hasNextLine()) {
System.out.println(scanFile.nextLine());
}
} catch(FileNotFoundException fnfe) {
System.out.println("Invalid file name supplied, please try again.");
}
}
}
Используйте метод file.exist(), чтобы проверить, что если вы хотите убедиться, что он существует, то это коды:
File sfile = new File(salesFile);
if (sfile.exists()) {
// ok, file exist do something.
...
}
С другой стороны, когда вы говорите, что "неверный файл" может быть чем угодно, если это плохое имя файла, тогда это другое животное (ну, за исключением исключения)...
Чтобы использовать try/catch для файла только для чтения, тогда:
try {
FileInputStream sfile = new FileInputStream(salesFile);
...
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
}