Каков наилучший способ обработки исключения для недопустимого файла?

У меня есть класс 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());
}
Другие вопросы по тегам