Рубрики
Без рубрики

Исключения в Java являются полезными: может быть, вы что не знаете, использовать их

Исключения в Java являются полезными: может быть, вы что не знаете, как использовать. С тегами java, pt br, braziliandevs, учебное пособие.

На прошлой неделе писал о том, как разработчики усложняют код Java. Возвращаюсь в эту тему, теперь поговорим немного об очень полезная функция языка, что, я считаю, это очень неправильно поняли: exceptions.

Исторический обзор

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

Чтение этой спецификации, является интересно, особенно когда мы видим в явной форме основных целей дизайнеров в создании языка на тот момент: обеспечить переносимость и надежность . Признавая исключений, что меня действительно интересует, – это второй принцип. Как эта надежность достигается?

Перед немного семантика: exception, как само название уже говорит нам, что указывает ненормальное состояние, которое возникает в процессе реализации наших программ.

Жизнь без исключений

Многие языки программирования, просто уточняя реализации программного обеспечения (думаю, в C или Pascal), когда что-то происходит, и не существует какой-то способ обработки ошибки узором, другой альтернативой является просто вернуть код ошибки, который может быть легко проигнорировано, программист (думаю, в функции read C возвращается значение -1, например).

Давайте на пример, с помощью “псевдо-C”. Язык распри вызов функции read (описанное выше), который считывает байт из источника данных и сохраняет его в буфере. Она возвращает значение -1, если что-то не так происходит, и 0, если мы пришли в конец файла и положительное значение, в о том, сколько байтов было прочитано. См. код ниже:

char buffer[128];
read(arquivo, buffer, 128);
printf("Serei impresso?");
// operações importantes seriam executadas na sequência

Это очень распространенный: разработчик ожидает, что файл всегда существует, таким образом, она “уверена”, что выход “я Буду монтажом?” всегда будет отображаться в вашем терминале. Но это не всегда так: и если файл мнимой жизни? Наш наивный программист будет решать проблемы, так как выполнение программы закончится в какой-то момент после этой печати.

Может быть, наш программист мог написать выше код по-другому, как показано в примере ниже:

char buffer[128];
int resultadoLeitura = read(arquivo, buffer, 128);
if (resultadoLeitura < 0) {
// tento corrigir a situação aqui
}

Является альтернативой, код стал более надежным, но его чтение не становится ясно, что на самом деле произошло для условий ошибки. Файл был удален? Было бы разрешение проблемы? Еще хуже: код, что и побудило на написание программы, основной поток (в оптимальных условиях температуры и давления) в настоящее время находится объединены в код обработки ошибок.

Java пришел с решением более интересным. Видно, что наши занятия-это интерфейс, почему бы не предупредить своих клиентов о том, что может пойти не так, и, еще лучше: заставить их обрабатывать эти ситуации (проблема находится в этой “силы”их)?

Пенсандо комо Гослинг, Джой э Стил

Ясность записи

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

String conteudoArquivo(File arquivo) {
 try {
// meu fluxo principal entra aqui
 } catch (FileNotFoundException;ex) {
// o que eu faço se o arquivo não existir?
} catch (EOFException ex) {
 // e se o arquivo chegar ao fim antes do imaginado?
} catch (IOException ex) {
 // e se for algum outro erro de I/O que não previ e
// não seja como os que mostrei antes?
}
}

Интересно, как теперь вы знаете, что может быть, не так, и может различать ясно, как относиться к каждой из этих ситуаций. Еще лучше: то, что действительно важно, основной поток, четко изолированы.

Exception-это, в действительности, отклонение потока. Может быть, вы обрабатывать ошибки типа файл не найден и IOException таким же образом. В этом случае, в качестве первого исключений является подклассом второго, просто поместите один блок catch для этого.

Исключения, как контракт

Больше, чем это, я считаю, что многие разработчики просто не знали, как интерпретировать код, который находят: представьте себе, что объявление метода, как показано ниже:

void processeArquivos(File[] arquivos) throws FileNotFoundException

Метод говорит мне:

Метод, договора , и исключение, проверки, что же будет достигнута. Если не так, то поток должен быть изменен таким образом, чтобы o есть и ответственность, чтобы решить эту проблему, переложены на другой объект (может быть, клиент клиента).

Что это: договор действительным является тот, так и значение. Легко заметить, когда тот, кто пишет код не имеет большого идея о том, что вы делаете. Обратите внимание, в объявлении ниже:

void processeArquivos(File[] arquivos) throws Throwable

То, что этот метод мне говорит?

У нас есть средства контракт здесь: мы только знаем, что мы должны передавать файлы, чтобы этот метод. Не знаю, если все должны на самом деле быть доступны только отправки.

Исключения проверяется и не проверяется. Ты что?

Например, как это “проверенные исключения” и “непроверенные исключения”? То, что отличает одну от другой? Интерпретация быстрый будет:

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

Например: файл недоступен ошибка поддается лечению. Если возникла ошибка типа файл не найден, то, возможно, удастся создать новый файл, а затем вызвать эту функцию или процедуру еще раз.

С другой стороны, если есть авария, но моя операционная система или мой файловой системы исчезнуть, не есть много, что я могу сделать. Это ошибка времени выполнения (runtime). И количество проблем такого рода, которые могут возникнуть, практически бесконечен: HD может загореться, или HD может быть удален, или ваша операционная система может исчезнуть, или сеть может стать недоступной, или кто-то может выключить сервер, или….

Почему исключения типа во время Выполнения, которые не являются “checked”? Я хочу попросить Гослинг, Радость и Стил силы. Посмотрите, что сказано в разделе 11.2.2 спецификации :

Интересно также посмотреть, что авторы говорят в спецификации к нам, говорят, что еще одна категория ошибок (java.lang. Error) не будут проверяться (11.2.1):

Таким образом, вместо того, чтобы заставить разработчиков лечения каждого эти проблемы, почему не заставляет его заниматься только тем, что договора ? Это один из главных мотиваторов: тебя заставить писать меньше кода и, кто знает, написать код, лучшее качество.

Это не означает, что вы должны написать код, как следовать:

try {
// aqui está meu fluxo principal
} catch (Throwable t) {
// aqui lidarei com todos os problemas possíveis e impossíveis
// dos multiversos
}

Когда мы пишем что-то вроде “catch (Throwable)” мы с одним из следующих идей в голове:

Если один из руководящие принципы создания Java была надежность, и мы используем Java (пропустите свой любимый язык на мгновение), написать код такого типа является искажать язык и вводить в заблуждение.

Это: checked exceptions позволяют компилятор проверить, если вы имеете дело с ситуациями, аномальных, определенные в договоре их интерфейсов.

Как хорошо исключения?

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

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

  • Воспринимайте исключения, как определение договора четко определены: они определяют помещения, или то, что не должно произойти на, что код может быть выполнен успешно.
  • Воспользуйтесь точности: “catch (Throwable)” не дает вам возможность справиться с различными ситуациями, или нарушения условий договора, которые могут возникнуть во время работы системы, вам будет только создание блока catch, который в будущем может стать настоящий монстр.
  • Entenda a differença entre проверенные и непроверенные исключения.
  • Один declaraçao метода, который содержит instruçao броски следуют 293847 типов исключений и что-то вроде “бросает Throwable,” одно и то же.
  • Если checked exceptions являются для вас проблемой, рассмотрите языки, такие как Groovy, что делает обрабатывать исключения задачи дополнительно

Я надеюсь, что этот текст быть уточнены некоторые моменты, об одном из самых интересных аспектов языка Java.

Оригинал: “https://dev.to/loboweissmann/excecoes-do-java-sao-uteis-talvez-voce-e-que-nao-saiba-usa-las-669”