Взгляните на ошибки времени выполнения Java
Краткий обзор ошибок времени выполнения Java
· Что такое ошибки времени выполнения в Java?
· Ошибка времени выполнения VS Ошибка времени компиляции
· Типы ошибок времени выполнения
· Как появляется ошибка времени выполнения?
· Нужно ли выдавать ошибки времени выполнения
· Что происходит, когда вы не перехватываете исключения времени выполнения
· Пример ошибки времени выполнения
Что такое ошибки выполнения в Java?
Ошибки, возникающие во время выполнения программы, называются ошибками времени выполнения. Эти типы ошибок не могут быть обнаружены во время компиляции, поскольку в их синтаксисе нет ничего плохого. Таким образом, ошибки времени выполнения возникают, когда программа успешно скомпилирована без каких-либо ошибок и создания файла «.class». Однако программа не выполняется должным образом. Эти ошибки обнаруживаются во время выполнения или во время выполнения программы.
Компилятор Java не обнаруживает ошибок времени выполнения, потому что компилятор Java не имеет какой-либо техники для обнаружения этих ошибок, поскольку ему недоступна вся информация времени выполнения. Ошибки времени выполнения перехватываются виртуальной машиной Java (JVM) во время работы программы.
Эти ошибки времени выполнения называются исключениями , и они аварийно завершают программу, выдавая сообщение об ошибке.
Исключения — это ошибки, возникающие во время выполнения. Мы можем использовать методы обработки исключений в Java для обработки этих ошибок времени выполнения. При обработке исключений часть кода, которая, по мнению программиста, может вызвать ошибку, помещается внутрь блока try, а программист может перехватить ошибку внутри блока catch.
Ошибка выполнения VS Ошибка времени компиляции
Ошибка времени компиляции обычно относится к ошибкам, которые соответствуют семантике или синтаксису. Ошибка времени выполнения относится к ошибке, с которой мы сталкиваемся во время выполнения кода во время выполнения . Мы можем легко исправить ошибку времени компиляции во время разработки кода. Компилятор не может идентифицировать ошибку времени выполнения.
Обнаружение
Компиляторы могут легко обнаружить ошибки времени компиляции во время разработки кода. Компилятор не может легко обнаружить ошибку времени выполнения. Таким образом, нам нужно идентифицировать его во время выполнения кода.
Ссылка
Ошибка времени компиляции обычно относится к ошибкам, которые соответствуют семантике или синтаксису. Ошибка времени выполнения относится к ошибкам, которые не обнаруживаются компилятором, но мы сталкиваемся с ними во время выполнения кода (во время выполнения).
влияние
Ошибки времени компиляции — это семантические или синтаксические ошибки, они препятствуют запуску кода (компиляции), поскольку обнаруживают некоторые синтаксические ошибки. Ошибки выполнения Wheares препятствуют полному выполнению кода.
Фиксация
Мы можем легко исправить ошибку времени компиляции во время разработки кода. Компилятор не может идентифицировать ошибку времени выполнения. Но мы можем исправить это после выполнения кода и идентификации кода ранее.
Типы ошибок выполнения
Существует несколько типов ошибок времени выполнения, с которыми мы можем столкнуться во время выполнения программы. Некоторые часто встречающиеся ошибки во время выполнения перечислены ниже:
Ошибки ввода данных : Ошибки ввода-вывода
Существует бесчисленное множество способов, которыми пользовательский ввод может повредить приложение.
На доске комментариев на основе HTML пользователь, которому разрешено невинно отправлять незакодированный знак меньше (<) или больше (>), может полностью разрушить способность этой веб-страницы отображаться. Точно так же системы обработки текста, рассчитанные на ввод всего ввода в формате ASCII, могут преждевременно завершать работу, если они получают смайлики или нестандартные вводимые символы.
Более того, излюбленным вектором атаки хакеров является SQL-инъекция , которая скрывает вредоносный исполняемый запрос к базе данных внутри безобидного поля ввода. Это может не только привести к сбою приложения, но и привести к потере контроля над всем уровнем данных.
Процесс очистки ввода или очистки данных преобразует широкий спектр данных, которые потенциально могут быть введены в приложения, в безопасный диапазон значений, понятных программе. Использование таких библиотек помогает смягчить ошибки времени выполнения, вызванные сбоями очистки ввода.
Популярные платформы Java, такие как Apache BVal и Hibernate Validator, выполняют простую очистку ввода на основе аннотаций и легко интегрируются в любое приложение на основе Java.
Плохо реализованная логика
То, что код компилируется, не означает, что он работает правильно. Код часто содержит логические проблемы, которые приводят к сбою приложения во время выполнения.
Java содержит встроенную конструкцию для обработки класса распространенных ошибок времени выполнения, связанных с кодом, который называется RuntimeException или непроверенным исключением. Java 17 определяет 78 таких ошибок только в SDK, а другие проекты и фреймворки дополнительно определяют свои собственные ошибки RuntimeException.
- Исключение времени выполнения
- ArrayIndexOutOfBoundException
- ConcurrentModificationException
- ClassCastException
- …
По крайней мере, каждое приложение должно включать в себя общий механизм обработки исключений, который может перехватывать все возможные исключения RuntimeException, регистрировать ошибки и позволять прерывать проблемный поток выполнения, а не прерывать все приложение.
Недостаточно ресурсов времени выполнения
Разработчики программного обеспечения не берут на себя вину за каждый тип возникающих ошибок во время выполнения. Многие ошибки времени выполнения в Java связаны с ограничениями ресурсов, вызванными проблемами с базовой инфраструктурой. Примеры включают: тайм-ауты сети, нехватку памяти , чрезмерную загрузку ЦП или невозможность запланировать поток на процессоре.
Одним из способов избежать ошибок времени выполнения, связанных с ресурсами, является использование инструмента нагрузочного тестирования, такого как JMeter или LoadRunner, в конвейере CI/CD приложения. Если эти инструменты обнаруживают возможную проблему с производительностью, они могут остановить приложение, прежде чем оно перейдет дальше по конвейеру к производственному развертыванию.
Загрузка некоторых приложений сильно различается. Например, приложение для финансовых услуг большую часть времени может испытывать постоянную нагрузку, но быть чрезвычайно загруженным в конце торгового дня. Налоговая служба может столкнуться с пиковой нагрузкой до истечения крайнего срока подачи документов, но в остальное время года у нее будет относительно небольшая нагрузка.
Команды DevOps должны отслеживать свои показатели производительности с помощью инструментов для упреждающего обнаружения и устранения ошибок времени выполнения, связанных с ресурсами. Примеры таких инструментов включают JDK Flight Recorder и Java Mission Control .
Для приложений с совершенно непредсказуемыми рабочими нагрузками используйте облачную технологию балансировки нагрузки для эластичного распределения ресурсов. Это устраняет как недораспределение ресурсов, так и ловушку покупки дорогого, редко используемого оборудования.
Конфигурация внешнего ресурса
Корпоративные приложения редко существуют в изолированном пузыре. Обычно они взаимодействуют со всем, от баз данных NoSQL и реляционных систем до очередей Kafka и RESTful API. К сожалению, если ваше приложение не может подключиться к требуемой внешней системе, это неизбежно приводит к ошибке времени выполнения.
Внешний ресурс может спровоцировать ошибку времени выполнения, если произойдет любая из следующих ситуаций без соответствующего обновления вызывающей программы:
- меняется IP-адрес;
- изменение учетных данных;
- изменение конфигурации брандмауэра; или
- внешняя система отключается на техническое обслуживание.
Соответственно, инструменты хаос-инженерии случайным образом завершают процессы, от которых зависит приложение. Такие инструменты заставляют разработчиков писать код, который остается отзывчивым и отказоустойчивым даже в случае сбоя внешних систем.
Неотъемлемая проблема внешних ресурсов заключается в том, что разработчики не могут их контролировать, но они могут контролировать, как приложение реагирует на отказ этих внешних ресурсов. Предугадывайте ошибки времени выполнения, создаваемые системами, которые вы не контролируете, и создавайте приложения, корректно реагирующие на сбои этих внешних систем.
Уязвимости сторонних библиотек
Любое нетривиальное корпоративное приложение включает в себя десятки зависимостей от сторонних библиотек для выполнения таких функций, как ведение журнала, мониторинг, проверка ввода, обработка форм и многое другое.
К сожалению, любые ошибки в сторонней библиотеке становятся ошибками в развертываемом вами приложении. Это стало неприятно реальным для мира Java в декабре 2021 года, когда ошибка внедрения LDAP в широко используемой библиотеке Log4j 2 вынудила JVM по всему миру отключиться.
Один из способов уменьшить вероятность того, что программные зависимости могут вызывать ошибки времени выполнения в приложениях, — это использовать только доверенные библиотеки таких организаций, как Apache или Eclipse.
Еще одна защитная мера — регулярно обновлять зависимости приложения до последней версии, как только обновления становятся доступными.
Наконец, помните о вторичных или третичных зависимостях — тех, на которые опираются сами ваши первичные зависимости — и помните о любых рисках, которые они несут с собой.
В мире разработки программного обеспечения «идеально» — враг «сделано». Ни одна программа не застрахована от угрозы непредвиденной ошибки во время выполнения. Однако, если корпоративные разработчики узнают о возможных причинах и предпримут шаги для смягчения потенциальных угроз, они смогут создать программное обеспечение, сводящее к минимуму вероятность возникновения ошибки во время выполнения.
Как появляется ошибка времени выполнения?
Поздравляем! Если ваша командная строка выглядит так:
Тогда вы успешно скомпилировали свою программу в байт-код Java, а это означает, что в вашем коде не было синтаксических проблем! Но, как следует из названия файла, когда мы запускаем эту программу:
Теперь мы столкнулись с ошибкой времени выполнения. Ошибки времени выполнения обычно возникают, когда в вашем коде есть что-то логически неправильное. В этом документе объясняется, как читать и исправлять ошибки времени выполнения.
Вот основные части ошибки времени выполнения
Исключение в потоке «main» : эта часть появляется для большинства ошибок времени выполнения. Он просто говорит вам, что в основном методе произошло исключение, которое должно происходить постоянно.
java.lang.ArrayIndexOutOfBoundsException: 5 : произошла ошибка. Название ошибки обычно дает представление о том, что могло произойти. В этом случае мы знаем, что он имеет дело с массивами и выходит за пределы отведенного для массива пространства.
at RunTimeErrors.main(RunTimeErrors.java:10) : это называется трассировкой стека, которая сообщает вам список методов, выполняющихся при возникновении ошибки.
- RunTimeErrors.main сообщает нам, что эта ошибка произошла в основном методе класса RunTimeErrors.
- RunTimeErrors.java:10 сообщает нам, в каком файле это произошло и в какой строке это произошло. В данном случае это произошло в нашем основном классе в строке 10 .
Иногда вам нужно выполнить проверку, чтобы решить, следует ли генерировать исключение времени выполнения, если система не может сделать это в одиночку, часто при работе с IllegalArgumentException, но в большинстве случаев вам не нужно выполнять проверку, потому что это часть стандартная проверка во время выполнения, которую Java выполняет для вас.
давайте возьмем NullPointerException в качестве примера:
if(t == null)
throw new NullPointerException();
if(t != null) {
// work with t reference
}
Что происходит, когда вы не перехватываете исключения среды выполнения? Поскольку компилятор не навязывает для них спецификации исключений, вполне вероятно, что RuntimeException может проникнуть в ваш метод main(), не будучи перехваченным. Чтобы увидеть, что происходит в этом случае, попробуйте следующий пример:
//: exceptions/NeverCaught.java
// Ignoring RuntimeExceptions.
// {ThrowsException}
public class NeverCaught {
static void f() {
throw new RuntimeException("From f()");
}
static void g() {
f();
}
public static void main(String[] args) {
g();
}
} ///:~
Exception in thread "main" Java.lang.RuntimeException: From f()
at NeverCaught.f(NeverCaught.Java:7)
at NeverCaught.g(NeverCaught.Java:10)
at NeverCaught.main(NeverCaught.Java:13)
Имейте в виду, что в коде можно игнорировать только исключения типа RuntimeException (и подклассы), поскольку компилятор тщательно следит за обработкой всех проверенных исключений. Причина в том, что RuntimeException представляет собой ошибку программирования, а именно:
Ошибка, которую вы не можете предвидеть. Например, пустая ссылка, которая находится вне вашего контроля.
Ошибка, которую вы, как программист, должны были проверить в своем коде (например, ArraylndexOutOfBoundsException , где вы должны были обратить внимание на размер массива). Исключение, которое происходит из пункта № 1, часто становится проблемой для пункта
Вы видите, какое огромное преимущество в этом случае — наличие исключений, поскольку они помогают в процессе отладки.
Интересно отметить, что вы не можете классифицировать обработку исключений Java как одноцелевой инструмент. Да, он предназначен для обработки надоедливых ошибок во время выполнения, возникающих из-за сил, не зависящих от вашего кода, но он также необходим для определенных типов программных ошибок, которые компилятор не может обнаружить.
Пример ошибки времени выполнения
public class Temp {
public static void main(String[] args) {
Temp t = initT();
t.foo("Hi");
}
private static Temp initT() {
return null;
}
public void foo(String s) {
System.out.println(s.toLowerCase());
}
}
Exception in thread "main" java.lang.NullPointerException
at Temp.main(Temp.java:7)
В эту категорию входит целая группа типов исключений. Они всегда выбрасываются Java автоматически, и вам не нужно включать их в спецификации исключений. Достаточно удобно, что все они сгруппированы вместе, поместив их в один базовый класс с именем RuntimeException , который является прекрасным примером наследования: он устанавливает семейство типов, которые имеют некоторые общие характеристики и поведение. Кроме того, вам никогда не нужно писать спецификацию исключений, в которой говорится, что метод может генерировать RuntimeException (или любой другой тип, унаследованный от RuntimeException ), потому что они являются непроверяемыми исключениями. Поскольку они указывают на ошибки, вы обычно не перехватываете исключение RuntimeException.— решается автоматически. Если бы вы были вынуждены проверять RuntimeExceptions , ваш код мог бы стать слишком беспорядочным. Несмотря на то, что обычно вы не перехватываете RuntimeExceptions , в своих собственных пакетах вы можете генерировать некоторые RuntimeExceptions .
См. наиболее распространенные исключения во время выполнения
Приятного обучения
Присоединяйтесь к группе Mouad Oumous Java в WhatsApp
Присоединяйтесь к каналу Telegram Mouad Oumous ПРИСОЕДИНЯЙТЕСЬ
Поддержите нашу публикацию, подписавшись на нее
GraphQL с Spring Boot Самые распространенные ошибки среды выполнения Java Начало работы с Spring Boot: подробное руководство для начинающих 10 простых, но эффективных способов улучшить качество жизни Наиболее часто задаваемый вопрос на собеседовании на основе Java8 Stream — заключительная часть Я заработал 300 долларов, написав книгу за 2 дня — вот как работает цепочка исключений в Java | Обработка исключений Как создать простой проект Quarkus с интеграцией с базой данных
![В любом случае, что такое связанный список? [Часть 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































