Почему исключения ввода-вывода должны обрабатываться с помощью Buffered Reader, а для Scanner это не обязательно? - PullRequest
0 голосов
/ 12 февраля 2020
void input () throws IOException 
{
   .......
}

Это прекрасно работает как со Сканером, так и с Buffered-Reader

void input ()
{
 .......
}

Но почему это показывает ошибку компиляции в Buffered Reader и отлично работает в Сканере.

Если произошла какая-либо ошибка это должно быть показано во время выполнения, но почему обязательно указывать компилятору явно, в случае Buffered-Reader, а не в случае Scanner

Ответы [ 4 ]

3 голосов
/ 12 февраля 2020

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

Некоторые (большинство) BufferedReader методов выдают IOException, которое является «проверенным» исключением. Это означает, что вы должны указать, когда ваш метод его выбрасывает (ie. Не перехватывает его).

На первый взгляд кажется, что методы в Scanner выдают «непроверенные» исключения (исключения) которые происходят от RuntimeException). Их не нужно указывать, если ваш метод их выбрасывает (не перехватывает).

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

Редактировать: Чтобы ответить на ваш вопрос Что касается ошибок компилятора, компилятор заставляет вас либо перехватывать, либо явно объявлять любые исключения, которые вызываются вашим методом (или из методов, которые вы вызываете).

1 голос
/ 12 февраля 2020

Scanner не предназначен только для операций ввода-вывода.

Бросок IOException может сбить с толку клиентов, использующих сканер для целей без ввода-вывода. мой предыдущий ответ , в котором основное внимание уделяется Scanner, показывает пример использования Scanner для сканирования String:

class ScannerWrapper implements Iterable<E> {
    public Scanner scanner;

    public ScannerWrapper(Scanner scanner) {
        this.scanner = scanner;
    }

    public Iterator<String> iterator() {
        return scanner;
    }
} 

Scanner scanner = new Scanner("one,two,three");
scanner.useDelimiter(",");
ScannerWrapper wrapper = new ScannerWrapper(scanner);

for(String s : wrapper) {
    System.out.println(s);
}

Вы можете контролировать любой IOExceptions, выдаваемый базовым компонентом ввода-вывода через Scanner#ioException():

Возвращает IOException, последний раз выданный базовым читаемым данным этого сканера. Этот метод возвращает ноль, если такого исключения не существует.

1 голос
/ 12 февраля 2020

Причина в том, что BufferedReader методы throw IOException, вы можете проверить здесь: Документы: BufferedReader

При добавлении к вышеприведенному конструктору FileReader в приведенном ниже примере также выдается FileNotFoundException

 BufferedReader in = new BufferedReader(new FileReader("foo.in"));

IOException и FileNotFoundException оба проверяются как исключение и должны быть обработаны, или обработка исключения должна быть делегирована методу вызывающего (в вашем случае, input()) с помощью throws

Прочтите это для объяснения: https://javarevisited.blogspot.com/2011/12/checked-vs-unchecked-exception-in-java.html

С другой стороны, метод Scanner, который вы вызываете, может не вызывать checked-type исключение Документов : Сканер

0 голосов
/ 12 февраля 2020

Исключения должны быть пойманы или выброшены. Другими словами, вы должны поместить методы, которые могут генерировать исключения, в блок try / catch / (finally) или сообщить компилятору, что все в порядке, если этот метод генерирует определенные типы исключений.

...