Метод обработки исключений Java

Я испытываю определенные затруднения, реализовывая следующий метод при обрабатывании этих 3 исключений, о которых я, как предполагается, забочусь. Я должен включать блоки попытки/выгоды как, я делаю, или это должно быть оставлено для приложения вместо дизайна класса?

В методе говорится, что я, как предполагается, реализую это:

public Catalog loadCatalog(String filename)
         throws FileNotFoundException, IOException, DataFormatException

Этот метод загружает информацию из архива, указанного в каталоге продуктов, и возвращает каталог.

Это запускается путем открытия файла для чтения. Затем это продолжает читать и обрабатывать каждую строку файла.

Метод String.startsWith используется для определения типа строки:

  • Если тип строки является "продуктом", метод readProduct называют.
  • Если типом строки является "Кофе", метод readCoffee называют.
  • Если тип строки является "Пивоваром", метод readCoffeeBrewer называют.

После того, как строка обрабатывается, loadCatalog добавляет продукт (продукт, кофе или пивовар) к каталогу продуктов.

Когда все строки файла были обработаны, loadCatalog возвращает Каталог продуктов к методу, который выполняет вызов.

Этот метод может выдать следующие исключения:

  • FileNotFoundException — если указанные файлы не существуют.
  • IOException — Если существует ошибка при чтении информации указанного файла.
  • DataFormatException — если строка имеет ошибки (исключение должно включать строку, которая имеет неправильные данные),

Вот то, что я имею до сих пор:

public Catalog loadCatalog(String filename)
       throws FileNotFoundException, IOException, DataFormatException{
    String line = "";
    try {
        BufferedReader stdIn = new BufferedReader(new FileReader("catalog.dat"));
            try {
                BufferedReader input = new BufferedReader(
                    new FileReader(stdIn.readLine()));
                while(! stdIn.ready()){
                    line = input.readLine();                        
                    if(line.startsWith("Product")){
                        try {
                            readProduct(line);
                        } catch(DataFormatException d){
                            d.getMessage();
                        }
                    } else if(line.startsWith("Coffee")){
                        try {
                            readCoffee(line);                               
                        } catch(DataFormatException d){
                            d.getMessage();
                        }
                    }  else if(line.startsWith("Brewer")){
                        try {
                            readCoffeeBrewer(line);
                        } catch(DataFormatException d){
                            d.getMessage();
                        }
                    }
                }
            } catch (IOException io){
                io.getMessage();
            }
    }catch (FileNotFoundException f) {
        System.out.println(f.getMessage());
    }
    return null;
}
5
задан Laurel 22 April 2016 в 01:39
поделиться

3 ответа

Общая идея состоит в том, что вы перенаправляете исключения в соответствующее место для их обработки. Я собираюсь предположить, что ваш инструктор ожидает, что они будут обрабатываться в основном. В этом случае я могу предположить, что из-за предложения throws вам было дано. Простое практическое правило состоит в том, что если метод объявляет исключение в предложении throws, вы не перехватите его в этом методе. Таким образом, в методе, который вы пишете, не должно быть операторов catch.

Для этого вы должны изменить свой код примерно так:

public Catalog loadCatalog(String filename) 
    throws FileNotFoundException, 
           IOException, 
           DataFormatException
{
    String line = "";

    BufferedReader stdIn = new BufferedReader(new FileReader("catalog.dat"));
    BufferedReader input = new BufferedReader(new FileReader(stdIn.readLine()));

    while(!stdIn.ready())
    {
        line = input.readLine();

        if(line.startsWith("Product"))
        {
            readProduct(line);
        } 
        else if(line.startsWith("Coffee"))
        {
            readCoffee(line);
        }  
        else if(line.startsWith("Brewer"))
        {
            readCoffeeBrewer(line);
        }
    }

    return null;
}

, а затем в методе (предположительно main), который вызывает loadCatalog, вы должны:

try
{
   loadCatalog(...);
}
catch(FileNotFoundException ex)
{
    ex.printStackTrace(); 
}
catch(IOException ex)
{
    ex.printStackTrace(); 
}
catch(DataFormatException ex)
{
    ex.printStackTrace(); 
}

заменить printStackTrace чем-то подходящим.

Таким образом, метод loadCatalog не занимается отображением сообщений об ошибках, поэтому вы можете вызвать метод в графическом интерфейсе пользователя или в коде консоли, а вызывающий его код может выбрать, как отображать ошибку пользователю (или обрабатывать с ним каким-то образом).

1
ответ дан 14 December 2019 в 18:56
поделиться

Это зависит от того, хотите ли вы, чтобы класс или другая часть приложения, которая его использует, обработала исключение и сделала все необходимое.

Поскольку код, который будет использовать loadCatalog() вероятно, не будет знать, что делать с исключением ввода/вывода файла или формата, лично я бы выбрал создание исключения типа CatalogLoadException и бросил его из метода loadCatalog(), и поместить причину исключения (FileNotFoundException, IOException, DataFormatException) внутрь него, включив информативное сообщение в зависимости от того, какое исключение было вызвано.

try {
         ...
    //do this for exceptions you are interested in.
    } catch(Exception e) {
         //maybe do some clean-up here.
         throw new CatalogLoadException(e); // e is the cause.
    }

Таким образом, ваш метод loadCatalog() будет выбрасывать только одно единственное и значимое исключение.

Теперь код, который будет использовать loadCatalog(), будет иметь дело только с одним исключением: CatalogLoadException.

loadCatalog(String filename) throws CatalogLoadException

Это также позволит вашему методу скрыть детали своей реализации, так что вам не придется менять его сигнатуру "исключения" при изменении основной низкоуровневой структуры. Обратите внимание, что если вы измените эту сигнатуру, каждый фрагмент кода должен будет измениться соответствующим образом, чтобы иметь дело с новыми типами исключений, которые вы ввели.

См. также этот вопрос на Перевод исключений.


Обновленная информация о требовании к бросковой подписи:

Если вы должны сохранить эту сигнатуру, то у вас нет выбора, кроме как бросать их приложению, а не ловить их внутри метода loadCatalog(), иначе сигнатура throws будет бесполезной, поскольку мы не собираемся бросать точно такое же исключение, с которым только что имели дело.

4
ответ дан 14 December 2019 в 18:56
поделиться

Вот отличная статья Хайнца Кабуца, посвященная обработке исключений.

http://www.javaspecialists.eu/archive/Issue162.html

0
ответ дан 14 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: