Как правильно организовать вывод сообщения об ошибке в Java-программе?
Всё правильно делаете. Только если у вас приложение из консоли запускается я бы предложил использовать Commons CLI для парсинга входных аргументов. 
Не вижу проблемы валидации в конструкторе (например), но если очень хочется изменить — введите статичный фактори метод, в который помесьтите всю валидацию, а конструктор сделайте приватным.

Я бы, наверное, сделал бы так: Input в виде Commons CLI Options, далее преобразование его в класс-структуру настройки (не зависимой от CLI, в случае режима embedded такде заполнение этой структуры) без валидации, статичный фактори метод с этой настройкой, где происходит вся валидации и выставление параметров бизнес объекта.
«Обычно я пишу так» (с)

1. В конструкторе для все конфигурационных параметров задаются значения по умолчанию
2. Любыми способами — из переменных окружения, аргументов командной строки, кофигурационных файлов и т.п. пытаемся уточнить нашу конфигурацию
3. Создаем метод validate() — только в нем проверяем нашу конфигурацию на валидность и только в нем пишем ошибки, связанные с этим
4. Запускаем основную ветку пограммы

На псевдокоде это выглядит так
service = new TService();
service.loadConfig()
service.validateConfig();
service.doJob();

А в книжке все правильно написано — никаких исключений в конструкторах!