Речь идет не о классе, который вы используете, а о методах, которые вы вызываете, и о том, какие исключения они выдают.
Некоторые (большинство) BufferedReader
методов выдают IOException, которое является «проверенным» исключением. Это означает, что вы должны указать, когда ваш метод его выбрасывает (ie. Не перехватывает его).
На первый взгляд кажется, что методы в Scanner
выдают «непроверенные» исключения (исключения) которые происходят от RuntimeException). Их не нужно указывать, если ваш метод их выбрасывает (не перехватывает).
Ключ в том, что это зависит от того, какие исключения (проверенные или непроверенные) выбрасываются вызываемыми вами методами, и поймаете ли вы эти исключения или позволите им вспомнить вызывающий код относительно того, нужно ли указывать их в подписи вашего метода.
Редактировать: Чтобы ответить на ваш вопрос Что касается ошибок компилятора, компилятор заставляет вас либо перехватывать, либо явно объявлять любые исключения, которые вызываются вашим методом (или из методов, которые вы вызываете).