Прерывание программы для поврежденных плавающей точкой ввода


Моя подруга делает кучу работу с Java (командной строки, до сих пор играет) и я замечаю кучу попробовать/catch блоки вроде этого:

   try {
       double a = Double.parseDouble(secondInput);
   }
   catch(NumberFormatException nFE) {
       System.out.println("The input was not an integer.");
       try {
           Thread.sleep(1997);
       } catch (InterruptedException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
       System.exit(0);
   }

Который, ИМО, выглядит не очень красиво. И мне интересно, какой "лучше" способ написания этого кода будет.



4902
8
задан 25 апреля 2011 в 01:04 Источник Поделиться
Комментарии
5 ответов

Есть пара вопросов.


  • Почему применение паузы в течение 2 секунд перед выходом? Почему бы просто не выйти сразу? (И если ответ заключается в том, что вы работаете через окна cmd.exe-тогда вам лучше регулировать паузу на этом уровне ...)

  • Учитывая, что вам нужно сделать паузу, то вам лучше написать вспомогательный метод, чтобы сделать что-то вроде "напечатать сообщение, пауза и выход с ненулевым кодом выхода". Затем использовать его в нескольких местах, как требуется.

  • Вы должны быть установка ненулевой код выхода при выходе из-за сбоя. Это позволяет скрипт или как-то запустил Java приложение, чтобы обнаружить ошибки и (возможно) что-то делать; например, паузы, так что пользователь может увидеть сообщение об ошибке ...

  • С выдачей InterruptedException не ошибка программы, поэтому печать трассировки стека, наверное, не подходят.

Выяснить, что делать с выдачей InterruptedException исключением не является однозначным. Исключение означает, что что-то (либо пользователя или приложения) прервал заявке, либо до, либо во время сна.


  • В этом случае вы просто собираетесь выйти, поэтому наилучшая стратегия-в любом случае игнорировать ее выхода.

  • Вы должны решить, что это разумная вещь, чтобы сделать. Некоторые возможности:


    • Игнорировать прерывания и осуществлять независимо.

    • Предпринимать шаги, чтобы вызвать приложение, чтобы остановить то, что он делал; например, кинуть заказ снят "остановить сейчас" исключение. (Вы могли также называть системой.выход() напрямую, но это тоже может быть плохо, в зависимости от характера кодекса. Например, вызов системе.выход() в библиотеке ... или веб-приложение ... большой не-не.)

    • Пунто: восстановить "прерванное" состояние, вызывая поток.currentThread().прервать() в обработчик исключений. Например, вы можете сделать это, если некоторые вшита код проверки "прерывается" флаг.


9
ответ дан 25 апреля 2011 в 03:04 Источник Поделиться

Глядя на ваш конкретный случай из резьбы.сна, и зная, другими ввода/вывода исключений методы (метод close(), например), как насчет использования полезной библиотеки, такие как компания Google гуава?

Для файлов примеру, вы можете использовать Closables.closeQuietly(файловый дескриптор), который не выдает исключение. См.:

Для вашего сна пример, вы могли бы сделать подобные методы (Если вы действительно хотели что-нить на сон ~2 секунды), спальное место.sleepQuietly(2000)и др.

3
ответ дан 25 апреля 2011 в 05:04 Источник Поделиться

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

В большинстве случаев трудно не попробовать/catch блоки, но все, что вам нужно сделать, в большинстве случаев, чтобы повторно сгенерировать исключение без какой-либо обработки. В моем коде я использую следующий шаблон (используя Throwables от компании Google гуава библиотеки):

void myMethod() {
try {
APIFunction1();
APIFunction2();
} catch (Exception e) { throw Throwables.propagate(e); }
}

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

1
ответ дан 25 апреля 2011 в 02:04 Источник Поделиться

Как насчет :

try {
double a = Double.parseDouble(secondInput);
}
catch(NumberFormatException nFE) {
displayNotIntegerErrorAndExit();
}

[...]
private void displayNotIntegerErrorAndExit() {
System.out.println("The input was not an integer.");
sleepFor(1997);
System.exit(0);
}

private void sleepFor(long delayInMs) {
try {
Thread.sleep(delayInMs);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

Примечание: Я не проверял, если он компилирует, но это, как я это делаю обычно. И это делает его легко увидеть, если вы не дублирующего кода (т. е. если вы делаете 300 sleepFor() методы).

Редактировать: в качестве дополнительного пункта. При правильном обращении, увеличение читабельности и гибкости или код, который приходит из исключений намного перевешивает незначительные затраты на обработку исключений.

1
ответ дан 29 июля 2011 в 11:07 Источник Поделиться

Не уверен, что на Java, так как это время, так как я кодировал с ним, но в C# попробовать-catch блок несет в себе накладные расходы, что лучше всего общества. Один блок стоит дорого, а лучше заменить условной оценке, чтобы предотвратить исключение быть брошенным в первую очередь, но с помощью вложенных блоков-это нормально для основного дома проекты но если бы мне пришлось коллегиального обзора, что код, что я хочу подтолкнуть его обратно к источнику разработчика и попросить их, чтобы выполнить рефакторинг кода, оптимизация.

0
ответ дан 25 апреля 2011 в 05:04 Источник Поделиться