Почему обязательно использовать «кидает IOException» - PullRequest
7 голосов
/ 25 февраля 2012

Почему обязательно использовать «throws IOException» в методе main при обработке внешней файловой операции, если файл находится в локальной файловой системе.

Ответы [ 5 ]

18 голосов
/ 25 февраля 2012

Возможно, добавление IOException к вашей основной функции необязательно, но обязательно нужно что-то сделать с этим исключением. Когда вы делаете файл IO, сетевой IO или другой (?) IO, что-то может пойти не так. Файл может не существовать, он может находиться в поврежденном секторе диска, в середине может произойти сбой сети (что может иметь значение для сети или файла, если диск не является локальным).

Причина, по которой вам нужно что-то сделать с IOException, заключается в том, что это проверенное исключение. Если вы вызываете конструктор или функцию, которая выдает проверенное исключение, то вам нужно либо обработать его, перехватив его и выполнив соответствующие действия. Или вам нужно сообщить компилятору, что вы знаете об исключении, но вы не планируете ничего с этим делать, и в этом случае вы должны объявить throws IOException в вашем определении функции.

Существует еще один тип исключений, непроверенные исключения (иногда называемые исключениями времени выполнения, поскольку все они расширяют RuntimeException). Непроверенные исключения должны были быть потенциальными проблемами во время выполнения. например NullPointerException (NPE), пример NPE, который возникает из-за условий во время выполнения, - это когда когда-то, что вы ожидаете вернуть объект, возвращает NULL, а затем вы пытаетесь вызвать метод для этого. Это теория, по крайней мере.

Так что вы можете подумать, ну, во-первых, исключения во время выполнения предназначены для непредвиденных проблем во время выполнения, тогда почему, черт возьми, это не IOException, а исключение во время выполнения! Не то, чтобы я планировал сломать диск фрекинга или заставить оператора экскаватора в Скенектади вывезти половину побережья. За громкий крик, я бы тоже хотел это знать! Кто-нибудь дал мне Аллилуйю, о, я слышал!

Я проделал тонну связанной с IO работы на Java, и набрав throws IOException, вроде как это бельмо на глазу, с которым я только что научился жить, потому что в целом это плохая идея пытаться обрабатывать исключения IOException на низком уровне. уровень, потому что низкоуровневый код вообще не знает каков контекст того, что вы пытаетесь сделать, и он должен позволить этим исключениям всплывать в коде, где есть контекст того, что вы делаете пытаясь достичь.

Да, и кстати, я упомянул, что хотел бы знать, почему IOException не является исключением времени выполнения, тогда как что-то вроде NPE? Да, это условие времени выполнения, но IO (диск, сеть, что угодно) гораздо менее надежно, чем вы думаете. Если вы уверены, что диск надежен, прочитайте о некоторых причинах, по которым Sun изобрела ZFS. И если вы считаете, что сеть надежна, попробуйте убедиться, что вы надежно загрузили маркетинговый контент в 15 000 дрянных киосков на базе Windows по паршивым сетям сторонних разработчиков, и убедитесь, что клиент никогда не увидит ненужное изображение, которое было повреждено из-за сети проблема. (Можете ли вы сказать, что ша-1 дети хэш-суммы? Я знал, что вы могли бы).

Я иду куда-нибудь с этим; Я обещаю.

Я думаю, что причина того, что IOException является проверенным исключением, заключается в том, что IO ненадежен (посмотрите на ошибку # 1 из Ошибок распределенных вычислений .) В общем, вы должны иметь возможность получить NPE содержит ошибки в вашем коде, но IO - это другой зверь, он ненадежен, и я думаю, что их целью было заставить вас задуматься об этом. Я упоминал, что одним из авторов Ошибок распределенных вычислений является Джеймс Гослинг. Джеймс Гослинг, тот самый человек, которого считают отцом Явы? Да, это по крайней мере моя теория. Либо это, либо это была просто огромная глупая ошибка. Многое есть в ранних библиотеках Java.

Было много споров о полезности проверенных исключений, и со временем я пришел к согласию с людьми, которые говорят, что они просто не стоят усилий, и если есть случаи, когда есть многораздражающие бессмысленные объявленные исключения, я оберну их и перезапущу соответствующее исключение времени выполнения (скажите привет моему lil другу !).Несмотря на это, я не связываюсь с IOException;мудрый поступок - жить с болью.

О, и для простоты, один ли код вписывается в общедоступную статическую пустоту main (String []) вызывает функцию IOException?Правильный ответ, вероятно, состоит в том, чтобы просто дать исключению всплыть и дать время выполнения сообщить об этом бедному парню, который пытается запустить ваш код.

Спасибо, спокойной ночи.

18 голосов
/ 25 февраля 2012

Нет необходимости использовать throws IOException. Если вы вызываете метод, который может вызвать исключение, вам необходимо либо

  1. Поймать его, или
  2. Объявите, что вы собираетесь сбросить его.

Второй - то, что вы делаете.Другой способ, который часто является предпочтительным, заключается в том, чтобы поймать и обработать исключение самостоятельно:

public static void main(String[] argv) {
    try {
        FileReader f = new FileReader("foo.txt");
        // ... more
    } catch (IOException ioe) {
        System.out.println("Trouble reading from the file: " + ioe.getMessage());
    } 
}
2 голосов
/ 25 февраля 2012

AFAIK, это не обязательно.

Вы либо обрабатываете исключение, либо нет.

Если вы обрабатываете исключение, вам нужно поставить try {...} catch(IOException e) {...}, но если вы не обработаете его, просто объявите throws IOException в текущем методе.

1 голос
/ 25 февраля 2012

Не обязательно бросать IOException ..... Но это своего рода хорошая привычка бросать IOException или fileNotFoundException, а затем ловить его так, чтобы, если ваш файл не был найден, программа не взорвалась и выдала вам сообщение об ошибке.

Вам нужно будет использовать Try and catch .... Вот фрагмент кода, который может быть полезен ...........

Scanner fileScanner = null;
        try
        {
            fileScanner = new Scanner(new File("YOUR FILE PATH"));
            while(fileScanner .hasNextLine())
            {
                String eachLine= scanner.nextLine();
                String[] wordsFromFile = eachLine.split("\\W");
            }
        }
        catch(FileNotFoundException e)
        {
            System.err.println("Cannot find the file");
        }
        finally
        {
            if(scanner!= null)
                scanner.close();
        }
0 голосов
/ 14 ноября 2015

Это не обязательно, но, по крайней мере, вам нужно либо обработать исключение, либо нет Если вы обрабатываете исключение, вам нужно поставить try {...} catch(IOException e) {...}, но если вы не обработаете его, просто объявите throws IOException в текущем методе.

...