Критическая ошибка джава

Время на прочтение
3 мин

Количество просмотров 46K

Критическая уязвимость в Java, в библиотеке log4j, которая используется в тысячах сервисов, начиная от Minecraft и заканчивая Apple Cloud, быстро превращается в серьезную угрозу для организаций по всему миру. Уязвимости подвержены сервера Apple, Valve, Microsoft и других.

  «Интернет сейчас в огне», — сказал журналистам Адам Мейерс, старший вице-президент компании Crowdstrike, занимающейся кибербезопасностью. — «Люди изо всех сил стараются исправить это, и в то же время самые разные люди пытаются это использовать». В пятницу Мейерс сказал, что за 12 часов, прошедших с момента обнаружения уязвимости, она была «полностью поставлена на вооружение», и злоумышленники разработали и распространили инструменты для ее использования.

Уязвимость позволяет злоумышленникам удаленно выполнять код на уязвимых серверах, давая им возможность импортировать вредоносное ПО, которое может полностью скомпрометировать любые машины.

Уязвимость обнаружена в log4j, библиотеке логирования Java-программ с открытым исходным кодом. Ее используют тысячи игр и приложений, в том числе облачные сервера и корпоративное ПО. Почти каждая сетевая система безопасности запускает какой-то процесс регистрации, что дает огромные возможности популярным библиотекам, таким как log4j. Затронуты все системы и службы, использующие библиотеку логирования Java, Apache Log4j между версиями 2.0 и 2.14.1, включая многие службы и приложения, написанные на Java.

Уязвимость, получившая название «Log4Shell», может стать самой серьезной, обнаруженной за последние годы. Ей подвержены крупные компании и даже сайты правительства стран. С её помощью даже новички в области программирования могут получить доступ к внутренним сетям, где они могут похищать ценную информацию, устанавливать вредоносные программы, стирать важные данные и так далее.

Джо Салливан, директор по безопасности Cloudflare:

Мне сложно представить себе компанию, для которой это не риск. Неисчислимые миллионы серверов работают с log4j, полные последствия не будут известны в течение нескольких дней.

Амит Йоран, гендиректор компании Tenable, занимающейся кибербезопасностью, назвал Log4Shell «самой большой и самой критической уязвимостью последнего десятилетия». «и, возможно, самой большой в истории современных компьютеров».

Уязвимость получила 10 баллов из 10 от Apache Software Foundation, которая курирует разработку ПО. По ее словам, любой, у кого есть информация об эксплойте, может получить полный доступ к незащищенному компьютеру, который использует это программное обеспечение.

По словам экспертов, чрезвычайная легкость, с которой уязвимость позволяет злоумышленнику получить доступ к веб-серверу без пароля, — вот что делает уязвимость настолько опасной.

Одной из первых публично об обнаружении уязвимости рассказала группа реагирования на чрезвычайные компьютерные ситуации Новой Зеландии. Тогда же, в четверг, через несколько часов был выпущен патч. Apache об уязвимости, обнаруженной в её ПО, еще 24 ноября сообщила Alibaba. На разработку и выпуск фикса ушло две недели.

Хотя патч сейчас и выпущен, мало кто знает о наличии уязвимости (за исключением злоумышленников), поэтому многие сервера остаются уязвимыми. Так, как сообщает LunaSec, уже обнаружено, что Steam и iCloud от Apple сейчас уязвимы.

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

Эксперт по безопасности Маркус Хатчинс говорит в Твиттере:

Миллионы приложений используют Log4j для ведения журналов, и все, что нужно сделать злоумышленнику — это заставить приложение зарегистрировать специальную строку.

Пока что исследователи обнаружили доказательства того, что уязвимость может быть использована на серверах таких компаний, как Apple, Amazon, Twitter и Cloudflare.

  • Апдейт для библиотеки log4j можно найти тут.
  • Проверить свои машины на уязвимость можно тут.
  • Сообщение от Касперского по поводу уязвимости.

Хотите найти работу в IT? Подключайте себе телеграм-бот getmatch. Указываете зарплату и должность, и он выдает вам лучшие вакансии от компаний. Не нужно ни резюме, ни портфолио, настройка занимает меньше 30 секунд.

В начале недели эксперт по кибербезопасности Alibaba Чен Жаожун обнаружил критическую уязвимость в Java-библиотеке Log4j, которая используется в сотнях тысяч приложений по всему миру. Уязвимость позволяет получить удаленный доступ к серверу, на котором хранится приложение, и запустить на нем произвольный код. Вместе с экспертами разбираемся, почему библиотека так популярна, в чем суть уязвимости и как ее можно устранить.

Что такое Log4j и почему она так популярна

Log4j — часть проекта Apache Logging Project. Это библиотека для логирования, которая помогает анализировать поток выполняющихся инструкций на продакшене или в тестовом окружении. С ее помощью можно пометить все вызовы текстовыми инструкциями — это сильно упрощает процесс локализации проблем.

Библиотеку используют сотни тысяч программ, игр, облачных серверов и корпоративных приложений, в том числе от Amazon, Apple iCloud, Cisco, Cloudflare, ElasticSearch, Red Hat, Steam, Tesla и Twitter. В целом пользователей Log4j можно описать как очень крупные компании, которые по тем или иным причинам не используют актуальные версии Java. Чаще всего это энтерпрайз-сегмент, где любое обновление языка, фреймворка или библиотеки — большая проблема.

В энтерпрайз-сегменте наиболее популярны приложения, разработанные на технологии JavaEE/JakartaEE, а также с использованием Spring. В экосистеме Spring особую популярность последнее время получил фреймворк Boot, в котором в качестве дефолтной библиотеки логирования используется LogBack. Для компаний, которые используют Spring Boot (если не брать в расчет кастомное подключение Log4j2), уязвимость не грозит.

В чем опасность

Уязвимость CVE-2021-44228 (или Log4Shell) относится к классу Remote Code Execution и присутствует только в версиях Log4j с 2.0-beta9 до 2.14.1.

Log4Shell для подключения к серверу использует JNDI (Java Naming and Directory Interface). Это API, которое предоставляет единообразный механизм взаимодействия Java-программы с различными службами имен и каталогов. Зная JNDI-имя LDAP-сервера, базы данных или месседж-брокера, можно получить доступ к ним, используя операцию lookup.

Еще одно уязвимое место касается безопасности строк. Часто бывает так, что переменные раскрываются не только в конфигурационном файле, важном звене взаимодействия с библиотекой логирования, но и в строках. В ситуации с небезопасными строками библиотека сканирует сообщения пользователей и если видит в них исходный код, исполняет его. После этого хакер может загрузить вредоносный код на сервер — исследователи из SecurityLab описывают случаи, когда Log4Shell использовали для майнинга криптовалют или для DDoS-атак.

Составьте свое первое резюме:
Вы можете бесплатно опубликовать свое резюме в нашем сервисе «Хекслет-CV» и получить советы по его улучшению от разработчиков и HR-менеджеров

Что делать с уязвимостью

Лучший совет, который можно дать в сложившейся ситуации — обновить  Log4j до версии 2.15 или Java до версии 11. Если обновление — это проблема, есть несколько альтернативных решений:

  • Если приложение использует Log4j и запускается через команду java -d, можно выставить параметру system property значение true: java -Dlog4j2.formatMsgNoLookups=true.
  • Еще один вариант — подтянуть текущую настройку из переменных окружения (LOG4J_FORMAT_MSG_NO_LOOKUPS=true). Во втором случае никакие дополнительные параметры выставлять не нужно, они автоматически подтянутся из окружения.

Несколько более сложных решений описаны здесь.

Выводы

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

Кроме того, полезно периодически (раз в три-шесть месяцев) проводить аудит безопасности систем, которые эксплуатируются в продакшене. Не менее важно следовать рекомендациям, которые содержатся в отчетах службы безопасности. Это помогает выявлять общие проблемы и справляться со срочными изменениями (правда, с некоторыми ограничениями).

Никогда не останавливайтесь:
В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть сотни курсов по разработке на разных языках и технологиях

Как исправить зависание Центра обновления Windows?

Как исправить зависание Центра обновления Windows?

Windows — одна из самых популярных операционных систем, а также одна из самых «подверженных проблемам» операционных систем.

Когда мы говорим о Windows, в первую очередь мы думаем об обновлениях.

В большинстве случаев процесс обновления не сильно беспокоит пользователей, но иногда во время работы обновление Windows зависала, и это могло быть проблемой.

В этой статье мы расскажем, как исправить застывание или зависание обновления Windows.

Как исправить зависание Центра обновления Windows?

Как узнать, зависло ли обновление Windows?

Если вы видите одно из этих сообщений в течение длительного времени (более 3 часов), скорее всего, обновление зависло (применимо для Windows 10/8/7/Vista).

  • Подготовка к обновлениям Windows, не выключайте компьютер (обычно встречается в Windows 10),
  • Настройка обновлений Windows, xyz% завершено, компьютер не выключайте (часто встречается в Windows 7/8/Vista),
  • Работаем над обновлениями, xyz% завершен, не выключайте компьютер (Windows 10/8/7),
  • Не выключайте компьютер, пока это не будет сделано. Установка обновления x из x… (Windows 7/Vista),
  • Готовим Windows, не выключайте компьютер.

Мы рекомендуем вам подождать не менее 3-4 часов, если вы увидите какое-либо из вышеперечисленных сообщений, как будто процесс обновления идет нормально, и вы пытаетесь что-то сделать, могут возникнуть дополнительные сложности.

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

Как исправить зависание Центра обновления Windows

Если у вас есть старый ноутбук с индикатором жесткого диска, вы можете определить, зависло ли обновление или нет.

Если индикатор мигает с регулярным интервалом, это означает, что ОС обновляется, и вам не нужно ничего делать.

Однако если индикатор не мигает, можно предположить, что обновление зависло.

Возможные решения проблемы зависания Центра обновления Windows

1. Перезагрузка компьютера

Не нужно беспокоиться о появлении на экране сообщения «Пожалуйста, не выключайте компьютер».

Вы можете вернуться к Windows 10 после принудительного выключения без каких-либо проблем.

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

Перезагрузка компьютера

Нажатие «Ctrl + Alt + Del» также иногда срабатывает, если обновление застряло на определенной фазе.

Если это произойдет, компьютер перезагрузится, и вас встретит загрузка Windows.

2. Загрузитесь в безопасном режиме

Если с вашим компьютером что-то не так, вы можете определить проблему, загрузившись в безопасном режиме.

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

Если с обновлением что-то пойдет не так, вы автоматически загрузитесь в безопасном режиме.

Кроме того, существует множество способов загрузиться в безопасном режиме.

Загрузитесь в безопасном режиме

Один из часто используемых методов — это переход в меню «Питание — Выбор варианта перезапуска», удерживая клавишу «Shift».

Это вызовет дополнительные параметры, из которых вы можете перейти в «Параметры запуска — Включить безопасный режим» и нажать на перезагрузку.

Затем вы можете перезагрузить компьютер и нормально загрузиться в Windows.

3. Использование восстановления системы

При каждом обновлении Windows создает точки восстановления, которые можно использовать, если в процессе обновления что-то пойдет не так.

Сделать это можно так:

Зайдите в «Панель управления».

Панель управления

Перейдите в «Система и безопасность — Система».

Система и безопасность - Система

Найдите «Защита системы» слева от логотипа Windows.

Защита системы

В открывшемся новом окне найдите и нажмите «Восстановление системы».

Восстановление системы

Остальная часть процесса довольно очевидна.

После того, как все будет сделано, нажмите кнопку перезагрузки, и вы загрузитесь с предыдущими обновлениями Windows.

4. Использование дополнительных параметров для запуска восстановления

Если обновление зависло и компьютер не загружается, вам нужно будет создать загрузочный USB-накопитель с Windows 10 на нем.

Вы можете сделать это с помощью «Rufus», который является отличным инструментом для создания загрузочных USB-накопителей.

Когда вы закончите создание загрузочного USB, войдите в меню загрузки, нажав клавишу F2 / F12, когда во время загрузки появится логотип производителя.

Использование дополнительных параметров

Выберите параметр «Загрузить с USB / DVD-привода», чтобы загрузить программу установки Windows 10.

Загрузить с USB / DVD-привода

Внизу вы найдете опцию «Восстановить Windows 10», нажмите на нее, и вы войдете в меню «Дополнительные параметры».

5. Тестирование на сбой памяти

Тестирование на сбой памяти

Повторная установка ОЗУ или жесткого диска — еще одно решение этой проблемы.

Эта проблема встречается реже, но если вы пробовали любой другой метод и не увидели результатов, вам следует продолжить и протестировать память с помощью таких инструментов, как «MemTest86».

6. Переустановка Windows

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

Шаги для этого такие же, как шаги, упомянутые в разделе номер 4 «Использование дополнительных параметров для запуска восстановления».

Единственная разница в том, что вместо того, чтобы нажимать «Восстановить Windows 10», вам нужно нажать «Пуск» и пошагово следовать процессу.

Переустановка Windows

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

В большинстве случаев упомянутый выше метод «Переустановки Windows» должен устранить проблему.

Однако ничто не решает проблему — не остается другого варианта, кроме переустановки Windows.

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

Поделитесь этим с кем-нибудь из ваших знакомых, кто сталкивается с той же проблемой.

Долго выполняются дополнительные процедуры обновления 1С

После обновления программы 1С запускается обработка для дополнительной обработки данных. Иногда она зависает и может висеть очень долга. При этом пользователи не могут работать в 1С, не могут провести документы. При этом если запустить базу, что выходит окно “Результаты обновления программы”

Результат обновления программы

Версия программы успешно обновлена на версию 11.4.13.148

Выполняются дополнительные процедуры и обработки данных на версию 11.4.13.148
Работа с этими данными временно ограничена

Приоритет: Работа пользователей или Обработка данных 8 потоками

Результат обновления программы

Как принудительно обновить 1С

Если столкнулись с такой проблемой, то можно ускорить процесс обновления 1С. Для этого переходим в меню НСИ и Администрирование – Обслуживание – Регламентные операции – Регламентные и фоновые задания”:

Регламентные и фоновые задания

На закладке “Регламентные задания” находим строку с названием “Отложенное обновление ИБ”, устанавливаем на нее курсор и нажимаем кнопку “Выполнить сейчас”

Отложенное обновление иб

Через несколько минут в окне, где ранее было зависшее обновление 1С начнется процесс обновления и вскоре увидите окно с сообщением “Дополнительные процедуры обработки данных завершены”. Закрываете его и можно начинать работу.

Как ускорить процесс реструктуризации и обновления 1С в разы

Нам всем знакомо, как долго может идти обновление: это может занимать несколько часов, а в некоторых случаях – даже
несколько дней.

Однако, его можно заметно ускорить. А для этого нужно немного погрузиться в детали и поговорить о реструктуризации 🙂

Когда в 1С изменяются метаданные (добавляются документы, реквизиты, индексы), происходит изменение структуры таблиц.

При запуске обновления создается полная копия таблицы, включая индексы – уже с новой структурой. Этот процесс называется реструктуризацией. Разумеется, это все занимает довольно заметное время.

Для случаев, когда объемы данных небольшие, это не так чувствительно.

Но реструктуризация больших баз, в которых содержатся таблицы с десятками миллионов строк, может затянуться на несколько часов или даже дней. Потеря такого количества времени – это уже весьма болезненно.

Еще в платформе 8.3.11 появился механизм, который помогает ускорить реструктуризацию в разы, а в некоторых случаях – на порядки.

С момента выхода этого релиза прошло уже 5 лет, но, судя по вопросам в Мастер-группе, до сих пор многие не знакомы с этим механизмом и не знают о его преимуществах.

Сегодняшнее видео закрывает этот вопрос:

  • Объясняем, чем механизм, который появился в 8.3.11, отличается от стандартного способа реструктуризации
  • Показываем, как настроить и использовать новый механизм
  • Демонстрируем его преимущества и рассказываем о его недостатках
  • Объясняем, кому необходим этот механизм, а кому переходить на него не стоит.

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

Но даже если Вы работаете в маленькой компании и с этой проблемой еще не столкнулись – рекомендуем все-таки найти 17 минут и посмотреть его. Если завтра Вы поменяете работу и столкнетесь с такой проблемой – не придется волноваться из-за того, что Вы не в курсе таких нюансов.

Ключевые моменты видео:

  • 00:00 – Постановка задачи
  • 00:28 – Старый способ реструктуризации и его недостатки
  • 01:50 – Новый способ реструктуризации
  • 02:17 – Плюсы нового способа
  • 03:04 – Установка Java на сервер 1С
  • 04:18 – Настройка файла conf.cfg на клиенте
  • 05:40 – Демонстрация работы старого механизма
  • 07:36 – Демонстрация работы нового механизма
  • 08:58 – Особенности использования нового механизма
  • 09:10 – Включение протокола TCP/IP для СУБД
  • 10:52 – Проверка сторонних индексов
  • 13:20 – Настройка параметра MAXDOP в MS SQL
  • 16:36 – Итоги

Умение находить и устранять причины медленной и нестабильной работы систем на 1С обязательно для программистов 1С

После курса Вы сможете:
  • Оценивать состояние системы в любой момент времени
  • Быстро находить причины замедления в программном коде – и сразу писать его так, чтобы замедления в будущем не было
  • Отслеживать динамику производительности за определенный период
  • Устранять ожидания на блокировках и решать проблемы со взаимоблокировками
Для кого этот курс
  • Писать код, за который не стыдно – в нестабильное время особенно важно быть в компании на хорошем счету
  • Быть востребованным специалистом – на каждом втором собеседовании спрашивают про умение оптимизировать 1С
  • Не терять клиентов из-за того, что «ваша 1С тормозит, а вы ничего не делаете» – это и раньше было нехорошо, а теперь и вовсе непозволительная роскошь

Комментарии / обсуждение (26):

Добрый день, вижу только текстовый материал, по какой-то причине видео отсутствует или не отображается на странице, почему?

Здравствуйте, Анастасия!
Проверили — видео на странице воспроизводится корректно.
Попробуйте почистить кэш и cookie-файлы. Если это не решит проблему, стоит проверить настройки браузера, установленные в нем расширения и плагины либо воспользоваться другим браузером.

Добрый день!
Включал новый механизм. Вроде бы прошло. После пришлось поставить версию java выше 8. Стала появляться ошибка.
Отключил новый механизм, но стала появляться ошибка:

“В процессе обновления конфигурации базы данных при работе оптимизированного механизма обновления произошла критическая ошибка
по причине:
Критическая ошибка работы Java-процесса.
Путь к Java: C:Program FilesBellSoftLibericaJRE-11-Fullbinjava.exe
Действие: revert
Process ID: 5764
Код возврата: 1
Ошибка: Exception in thread “main” java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:4061)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:3157)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$100(SQLServerConnection.java:82)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:3121)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7151)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2478)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2026)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1687)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1528)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:866)
at com.microsoft.sqlserver.jdbc.SQLServerDataSource.getConnectionInternal(SQLServerDataSource.java:968)
at com.microsoft.sqlserver.jdbc.SQLServerDataSource.getConnection(SQLServerDataSource.java:69)
at com._1c.dmf.v8.cli.jdbc.V8DataSource.getConnection(V8DataSource.java:36)
at com._1c.dmf.v8.cli.jdbc.mssql.MsSqlDataSourceFactory.getYearOffset(MsSqlDataSourceFactory.java:86)
at com._1c.dmf.v8.cli.jdbc.mssql.MsSqlDataSourceFactory.create(MsSqlDataSourceFactory.java:51)
at com._1c.dmf.v8.cli.Migration.run(Migration.java:81)
at com._1c.dmf.v8.cli.Migration.main(Migration.java:65)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
… 17 more”
Можете подсказать в чем тут дело?

Значит у вас в файле conf по прежнему стоит параметр для использования нового механизма обновления. Проверьте файл conf и на клиенте и на сервере.

Проверял и на сервере и на клиенте. Все убрал. Но все равно выходила ошибка. Выходила не на всех базах, только на одной. Хотя все базы расположены на одном сервере 1С.
Помогла переустановка платформы на сервере.

Язык Javaпозволяет программисту описывать
алгоритм обработки ошибок как обработку
«бросаемых» исключений. Исключение
— это попросту название некоторой ошибки.
При возникновении ошибки происходит
бросок исключения и возникает прерывание.JVMпроизводит поиск метода,
обрабатывающего прерывание. Если
обработка прерывания не указана, то
происходит ошибка времени выполнения.

Для генерации
исключения в языке Javaиспользуется операторthrow.
Операторthrowпрерывает
для указанного исключения выполнение
программы. Управление передается
соответствующему обработчику исключений.

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

try
{

if
(i==0) { throw new Exeptioni;} //Бросок исключения

}

catch(Exeptioni
e){

System.out.printin(«Перехвачено
исключение
Exeptioni»);

}

catch
(Exeption2 e) {

}

catch
(Exeption3 e) {

}

В качестве
перехватываемого исключения может
выступать как исключение, определенное
в JDK, так и исключение,
созданное программой.

Любое исключение
— это объект, являющийся экземпляром
класса Exeption. Для определения
своего собственного исключения следует
только объявить класс для этого
исключения.

class
Exeptioni extends Exeption {…} // Объявление.исключения

public
void MeMetod () throws Exeptioni, Exeption2 { …}

// Исключение

// объявляется, но
не перехватывается

Любое исключение,
возникающее при выполнении метода,
должно быть объявлено или перехвачено.
Если исключение перехватывается, то
управление передается соответствующему
блоку catchвнутри метода.
Если исключение объявляется, то управление
будет передано «вниз» по иерархии
вызовов методов методу, обрабатывающему
это исключение.

3. Ввод/вывод данных в консольном режиме.

Для вывода данных
в консольном режиме используется функция
из пакета System. Этот пакет
автоматически подключается любым
компиляторомJava.

  • System.out.print(объект)-
    выводит строку текста на экран, курсор
    остается на текущей строке;

  • System.out.println(объект)
    – выводит строку теста, курсор переходит
    на следующую строку;

С вводом информации
с клавиатуры дело обстоит сложнее,
поскольку системный пакет имеет только
объект связанный с потоком ввода. Для
того, чтобы ввести информацию с клавиатуры
нам необходимо связать этот объект с
объектом выполняющим чтение потока.
Для этого необходимо подключить класс
java.io.InputStreamReader,
который обеспечивает преобразование
данных потока в текстовую информацию.
Вся работа с файлами и потоками ввода
вывода в случае ошибки генерирует так
называемые исключительные ситуации
для обработки которых необходимо
подключить класс обработчик исключений
ввода-выводаjava.io.IOException.

Наиболее простым
в примером ввода информации с клавиатуры
является ввод строки текста. Пример
программного кода имеет следующий вид:

//
Объявляем переменную в которой будет
помещен

//
результат ввода информации

String
a;

//
Определяем блок обработки исключительных
ситуаций

try
{

//
Объявляем и создаем объект преобразования
данных потока

//
В
текстовой
вид

InputStreamReader
is=new InputStreamReader(System.in);

//
Объявляем текстовой буфер, длина которого
соответствует

//
максимальной длине строки.

char
buf[]
= new
char[128];

//
После этого в этот буфер производим
чтение

is.read(buf);

//
Этот буфер мы преобразовываем к строке

a=String.valueOf(buf);

//
После этого закрываем блок обработки
исключительных ситуаций.

}

//
И описываем поведение системы в случае
возникновения

//
ошибки при чтении данных

catch
(IO
Exception
e)
{

System.out.println(e.getMessage());

a
= null;

}

Для ввода числовой
информации также необходимо сначала
получить строку текста, после чего с
помощью класса преобразователя
преобразуется к значению числового
типа. Для исполнения данной операции
необходимо подключить библиотеку
обработки ошибок преобразования чисел
java.lang.NumbericFormatExceptionи класс – оболочку типа данных, к которой
необходимо преобразоватьjava.lang.Double;

//
Объявляем переменную в которой будет
помещен

//
результат ввода информации

double
a;

//
Определяем блок обработки исключительных
ситуаций

try{

//
Объявляем и создаем объект преобразования
данных потока

//
В
текстовой
вид

InputStreamReader
is = new InputStreamReader(System.in);

//
Объявляем текстовой буфер, длина которого
соответствует

//
максимальной длине строки.

char
buf[]
= new
char[128];

//
После этого в этот буфер производим
чтение

is.read
(buf);

//преобразовываем
к вещественному типу

a=Double.valueOf(String.valueOf(buf).trim()).double
Value();

//
После этого закрываем блок обработки
исключительных ситуаций.

}

//
описываем поведение системы в случае
возникновения

//
ошибки при чтении данных

catch
(IOException
e){

System.out.println(e.getMessage());

a
= 0;

}

//
описываем поведение системы в случае
возникновения

//
ошибки при преобразовании текстовых
данных в

//
вещественное
число

catch
(NumbericFormatException e1) {

System.out.println
(e1.getMessage());

a=0;

}

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

import
java.io.IOException;

import
java.io.InputStreamReader;

import
java.lang.NumbericFormatReader;

import
java.lang.Double;

//
объявляем класс

Class
m_cls
{

//
создаем функцию чтения строки

public
String
read_str()
{

//
Объявляем переменную в которой будет
помещен

//
результат ввода информации

String
a;

//
Определяем блок обработки исключительных
ситуаций

try
{

//
Объявляем и создаем объект преобразования
данных потока

//
В
текстовой
вид

InputStreamReader
is=new InputStreamReader(System.in);

//
Объявляем текстовой буфер, длина которого
соответствует

//
максимальной длине строки.

char
buf[]
= new
char[128];

//
После этого в этот буфер производим
чтение

is.read(buf);

//
Этот буфер мы преобразовываем к строке

a=String.valueOf(buf);

//
После этого закрываем блок обработки
исключительных ситуаций.

}

//
И описываем поведение системы в случае
возникновения

//
ошибки при чтении данных

catch
(IO
Exception
e)
{

System.out.println(e.getMessage());

a
= null;

}

if
(a = = null) return “”;

return
a.trim();

}

//
и функцию чтения вещественного числа

public
double
read_double()
{

//
Объявляем переменную в которой будет
помещен

//
результат ввода информации

double
a
= 0;

//
Определяем блок обработки исключительных
ситуаций

try
{

a=Double.valueOf(read_str()).doubleValue();

}

//
И описываем поведение системы в случае
возникновения

//
ошибки при чтении данных

catch
(NumbericFormatException
e){

System.out.println(e.getMessage());

a=0;

}

return
a;

}

}

Соседние файлы в папке СПО

  • #
  • #
  • #

#База знаний

  • 24 фев 2021

  • 13

Разбираемся, что такое исключения, зачем они нужны и как с ними работать.

 vlada_maestro / shutterstock

Мария Помазкина

Хлебом не корми — дай кому-нибудь про Java рассказать.

Из этой статьи вы узнаете:

  • что такое исключения (Exceptions);
  • как они возникают и чем отличаются от ошибок (Errors);
  • зачем нужна конструкция try-catch;
  • как разобраться в полученном исключении
  • и как вызвать исключение самому.

Код вашей программы исправно компилируется и запускается, только вот вместо желанного результата вы видите непонятный текст. Строчки его будто кричат на вас, аж побагровели.

За примером далеко ходить не надо: сделаем то, что нам запрещали ещё в школе, — поделим на ноль.

public static void main(String[] args) {
    hereWillBeTrouble(42, 0);
}

public static void hereWillBeTrouble(int a, int b) {
    int oops = a / b;
    System.out.println(oops);
}

А получим вот что:

Это и есть исключение.

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

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

У всех классов исключений есть общий класс-предок Throwable, от него наследуются классы Error и Exception, базовые для всех прочих.

Верхушка иерархии исключений Java

Error — это критические условия, в которых работа программы должна быть завершена. Например, когда при выполнении программы закончилась память, произошёл сбой в системе или виртуальной машине. Не будем задерживаться на этой ветке, поскольку документация Java говорит:

Error is the superclass of all the exceptions from which ordinary programs are not ordinarily expected to recover.

Что в переводе означает: ошибки (Error) — это такие исключительные ситуации, в которых восстанавливать работу программы не предполагается.

То есть это проблемы, которые нельзя (недопустимо) исправлять на ходу. Всё, что нам остаётся, — извиниться перед пользователем и впредь писать программы, где возникнет меньше подобных ситуаций. Например, не допускать такой глубокой рекурсии, как в коде ниже:

static void notGood() {
    System.out.println("Только не снова!");
    notGood();
}

При работе этого метода у нас возникнет ошибка: Exception in thread «main» java.lang.StackOverflowError — стек вызовов переполнился, так как мы не указали условие выхода из рекурсии.

А теперь об Exception. Эти исключительные ситуации возникают, если разработчик допустил невыполнимую операцию, не предусмотрел особые случаи в бизнес-логике программы (или сообщает о них с помощью исключений).

1. Невыполнимая операция

Мир не рухнул, как в случае с Error, просто Java не знает, что делать дальше. Как раз из этого разряда деление на ноль в начале статьи: и правда, какое значение тогда присвоить переменной oops?

Убедитесь сами, что исключение класса ArithmeticException наследуется как раз от Exception.

Стоит запомнить. В IntelliJ IDEA, чтобы увидеть положение класса в иерархии, выберите его и нажмите Ctrl + H (или на пункт Type Hierarchy в меню Navigate).

Другая частая ситуация — обращение к несуществующему элементу массива. Например, у нас в нём десять элементов, а мы пытаемся обратиться к одиннадцатому.

2. Особый случай в бизнес-логике программы

Классика. Программируем задачу о перевозке волка, козы и капусты через реку: в лодке может быть только два пассажира, но волка с козой и козу с капустой нельзя оставлять на берегу вместе. Это и есть особый случай в бизнес-логике, который нельзя нарушать.

Или пользователь вводит дату начала некоторого периода и дату его окончания. Вторая дата не может быть раньше первой.

Или, допустим, у нас есть метод, который читает файл. Сам метод написан верно. Пользователь передал в него корректный путь. Только вот у этого работника нет права читать этот файл (его роль и права обусловлены предметной областью). Что же тогда методу возвращать? Вернуть-то нечего, ведь метод не отработал. Самое очевидное решение — выдать исключение.

В дерево исключений мы ещё углубимся, а сейчас посмотрим, что и как с ними делают.

Простейший вариант — ничего; возникает исключение — программа просто прекращает работать.

Чтобы убедиться в этом, выполним код:

public static void main(String[] args) {
    hereWillBeTrouble(42, 0);
}

public static void hereWillBeTrouble(int a, int b) {
    System.out.println("Всё, что было до...");
    int oops = a / b;
    System.out.println(oops);
    System.out.println("Всё, что будет после...");
}

Так и есть: до деления на ноль код выполнялся, а после — нет.

Это интересно: когда возникает исключение, программисты выдают что-то вроде «код [вы]бросил исключение» или «код кинул исключение». А глагол таков потому, что все исключения — наследники класса Throwable, что значит «бросаемый» / «который можно бросить».

Второе, что можно делать с исключениями, — это их обрабатывать.

Для этого нужно заключить кусок кода, который может вызвать исключение, в конструкцию try-catch.

Как это работает: если в блоке try возникает исключение, которое указано в блоке catch, то исполнение блока try прервётся и выполнится код из блока catch.

Например:

public static void main(String[] args) {
    hereWillBeTrouble();
}

private static void hereWillBeTrouble(int a, int b) {
    int oops;
    try {
        System.out.println("Всё, что было до...");
        oops = a / b;
        System.out.println(oops);
        System.out.println("Всё, что будет после...");
    } catch (ArithmeticException e) {
        System.out.println("Говорили же не делить на ноль!");
        oops = 0;
    }
    System.out.println("Метод отработал");
}

Разберём этот код.

Если блок try кинет исключение ArithmeticException, то управление перехватит блок catch, который выведет строку «Говорили же не делить на ноль!», а значение oops станет равным 0.

После этого программа продолжит работать как ни в чём не бывало: выполнится код после блока try-catch, который сообщит: «Метод отработал».

Проверьте сами: запустите код выше. Вызовите метод hereWillBeTrouble с любыми значениями аргументов кроме нулевого b. Если в блоке try не возникнет исключений, то его код выполнится целиком, а в блок catch мы даже не попадём.

Есть ещё и третий вариант — пробросить исключение наверх. Но об этом в следующей статье.

Вернёмся к первой картинке. Посмотрим, что нам сказала Java, когда произошло исключение:

Начинаем разбирать сверху вниз:

— это указание на поток, в котором произошло исключение. В нашей простой однопоточной программе это поток main.

— какое исключение брошено. У нас это ArithmeticException. А java.lang.ArithmeticException — полное название класса вместе с пакетом, в котором он размещается.

— весточка, которую принесло исключение. Дело в том, что одно и то же исключение нередко возникает по разным причинам. И тут мы видим стандартное пояснение «/ by zero» — из-за деления на ноль.

— это самое интересное: стектрейс.

Стектрейс (Stack trace) — это упорядоченный список методов, сквозь которые исключение пронырнуло.

У нас оно возникло в методе hereWillBeTrouble на 8-й строке в классе Main (номер строки и класс указаны в скобках синим). А этот метод, в свою очередь, вызван методом main на 3-й строке класса Main.

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

Советую закреплять теорию на практике. Поэтому вернитесь в блок про Error и вызовите метод notGood — увидите любопытный стектрейс.

Всё это время мы имели дело с исключением, которое бросает Java-машина — при делении на ноль. Но как вызвать исключение самим?

Раз исключение — это объект класса, то программисту всего-то и нужно, что создать объект с нужным классом исключения и бросить его с помощью оператора throw.

public static void main(String[] args) {
    hereWillBeTrouble(42, 0);
}

private static void hereWillBeTrouble(int a, int b) {
    if (b == 0) {
        throw new ArithmeticException("ты опять делишь на ноль?");
    }
    int oops = a / b;
    System.out.println(oops);
}

При создании большинства исключений первым параметром в конструктор можно передать сообщение — мы как раз сделали так выше.

А получим мы то же самое, что и в самом первом примере, только вместо стандартной фразы «/by zero» теперь выдаётся наш вопрос-пояснение «ты опять делишь на ноль?»:

В следующей статье мы углубимся в иерархию исключений Java, узнаем про их разделение на checked и unchecked, а также о том, что ещё интересного можно с ними делать.

Научитесь: Профессия Java-developer PRO
Узнать больше

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Критическая ошибка гта 4 переустановите игру
  • Критическая ошибка гта 4 неисправимая ошибка
  • Критическая ошибка гта 4 дагестан 2
  • Критическая ошибка гта 4 smpa50

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии