Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции 2025. Java. Белая / Ответы на билеты. Java

.pdf
Скачиваний:
4
Добавлен:
02.01.2026
Размер:
4.52 Mб
Скачать

1. блок:

Код, который потенциально может выбросить исключение, помещается в блок.

2. блок:

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

блок указывается сразу после блока (или после другого блока).

Он принимает один параметр — объект исключения, которое он ловит.

Может быть несколько блоков для одного , каждый для своего типа исключения. Они проверяются по порядку. Первый , тип которого совместим с типом выброшенного исключения (т.е. тот же тип или его суперкласс), будет выполнен.

Multi-catch (с Java 7): Можно ловить несколько типов исключений в одном блоке, если логика обработки для них одинакова.

3. блок:

Блок указывается после и всех блоков.

Код в

блоке выполняется всегда, независимо от того:

 

Было ли выброшено исключение в

блоке.

 

 

Было ли исключение поймано соответствующим

блоком.

 

Произошел ли выход из

или

блока с помощью

,

или

.

 

 

 

 

Назначение: Используется для освобождения ресурсов (например, закрытие файлов, сетевых соединений, соединений с БД), которые были захвачены в блоке, чтобы гарантировать их освобождение даже в случае ошибки.

4. (с Java 7):

Более удобный и безопасный способ работы с ресурсами, которые реализуют интерфейс (например, потоки ввода-вывода, соединения JDBC).

Ресурсы, объявленные в (в скобках), автоматически закрываются при выходе из блока (в порядке, обратном их объявлению), даже если возникает исключение. Это избавляет от необходимости писать явный блок для закрытия ресурсов.

5. ключевое слово:

Используется для явного выбрасывания объекта исключения.

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

6. ключевое слово:

Используется в сигнатуре метода для объявления проверяемых (checked) исключений, которые метод может выбросить (но не обрабатывает сам). Вызывающий код обязан либо обработать эти исключения, либо также объявить их в .

Создание собственных классов исключений:

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

Лучшие практики обработки исключений:

Не ловите или . Ловите наиболее специфичные типы исключений.

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

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

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

Обработка исключений — критически важный аспект разработки надежных Javaприложений.

73. Сохраняемость. Serializable и Externalizable. Программирование распределенных приложений.

Сохраняемость (Persistence):

Сохраняемость — это способность объекта существовать вне времени жизни процесса, который его создал. То есть, состояние объекта может быть сохранено в некотором хранилище (например, файл, база данных) и позже восстановлено, даже после перезапуска приложения или на другой машине.

Сериализация (Serialization) в Java:

Сериализация — это стандартный механизм в Java для преобразования состояния объекта в последовательность байт (байт-стрим). Эта последовательность байт затем может быть:

Сохранена в файл. Передана по сети.

Сохранена в базу данных (хотя для этого чаще используются ORM или JDBC). Передана между различными JVM.

Десериализация (Deserialization) — это обратный процесс: восстановление объекта из последовательности байт.

Интерфейсы для сериализации:

Java предоставляет два основных интерфейса для управления процессом сериализации:

1. :

Это маркерный интерфейс (marker interface), то есть он не объявляет никаких методов. Сам факт его реализации классом указывает JVM, что объекты этого класса могут быть сериализованы.

Механизм по умолчанию: Если класс реализует , Java

использует стандартный (встроенный) механизм сериализации. Этот механизм автоматически пытается сохранить состояние всех нестатических и нетранзиентных () полей объекта.

Поля не сериализуются, так как они принадлежат классу, а не экземпляру.

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

Версионирование (): Для контроля совместимости версий сериализованных объектов рекомендуется объявлять

. Если это поле не объявлено, JVM сгенерирует его на основе структуры класса. Изменение структуры класса (добавление/удаление полей) без изменения (если он был явно задан) или при автоматически сгенерированном может привести к

при десериализации старых объектов. Кастомизация (необязательно): Класс может переопределить поведение стандартной сериализации, реализовав специальные методы:

Эти методы позволяют более тонко контролировать, какие данные и как записываются/читаются.

Пример:

2. :

Этот интерфейс расширяет и требует от класса полностью

взять на себя контроль над процессом сериализации и десериализации.

Класс, реализующий , должен предоставить реализацию двух методов:

: В

этом методе разработчик явно пишет состояние объекта в поток .

: В этом методе разработчик явно читает состояние объекта из потока и инициализирует поля. Важно: при десериализации объекта сначала вызывается его

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

Преимущества:

Полный контроль над форматом сериализованных данных.

Возможность более компактного или специфичного представления.

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

Недостатки:

Более сложен в реализации, так как вся логика ложится на разработчика.

Менее устойчив к изменениям в классе, если формат не продуман тщательно.

также используется и для классов.

Пример:

Сравнение

и

:

 

 

 

 

 

 

 

Характеристика

 

 

 

 

 

 

 

Управление

Автоматическое (по

Полностью ручное.

процессом

умолчанию), с

 

 

 

 

возможностью

 

 

 

 

кастомизации.

 

 

 

 

 

 

Реализация

Простая (маркерный

Более сложная (требует

 

интерфейс).

 

реализации

 

 

 

 

и

).

 

 

 

Конструктор без

Не обязателен для

Обязателен публичный

аргументов

десериализации (если нет

конструктор без аргументов

 

иерархии с Externalizable).

для десериализации.

 

 

 

Производительность

Может быть менее

Потенциально более

 

производительной из-за

производительная из-за

 

рефлексии.

 

прямого контроля.

 

 

 

 

 

Гибкость формата

Ограниченная.

 

Полная.

 

 

 

 

 

 

Характеристика

Имеет эффект (поля не

Не имеет прямого эффекта

сериализуются).

(разработчик решает, что

 

писать/читать).

Программирование распределенных приложений:

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

Передача объектов по сети:

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

Механизмы удаленного вызова методов (RMI - Remote Method Invocation), вебсервисы (SOAP, хотя он использует XML, а не бинарную сериализацию Java напрямую для обмена), системы обмена сообщениями (JMS) часто полагаются на сериализацию для маршалинга (упаковки) и анмаршалинга (распаковки) объектов.

Кеширование состояния:

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

Сохранение состояния для отказоустойчивости:

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

Проблемы и соображения при сериализации в распределенных системах:

Безопасность: Десериализация данных из недоверенных источников может быть уязвимостью (десериализационные атаки). Необходимо тщательно проверять и фильтровать входящие данные или использовать более безопасные форматы (например, JSON с валидацией схемы). Java 9+ ввела фильтры десериализации. Версионирование: Изменение классов со временем может привести к проблемам совместимости при десериализации старых объектов. Использование и продуманная стратегия эволюции классов важны. Производительность: Бинарная сериализация Java может быть не самым производительным или компактным форматом по сравнению с другими (например, Protocol Buffers, Avro, JSON).

Межплатформенная совместимость: Стандартная сериализация Java

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

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

74. Что такое JDBC?

JDBC (Java Database Connectivity) — это стандартный Java API (Application

Programming Interface), который определяет, как клиентское Java-приложение может получать доступ к различным типам баз данных (реляционным, NoSQL и др.).

Ключевые характеристики JDBC:

1.API, а не реализация: JDBC сам по себе является набором интерфейсов и

классов, находящихся в пакетах и . Он определяет контракт взаимодействия.

2.Независимость от конкретной СУБД: Основная цель JDBC — предоставить унифицированный способ работы с базами данных. Java-приложение, написанное с использованием JDBC, может (в идеале) подключаться к различным СУБД

(например, MySQL, PostgreSQL, Oracle, SQL Server, H2, SQLite) без изменения основного кода приложения, просто путем замены JDBC-драйвера.

3.Драйверная архитектура: Для подключения к конкретной СУБД используется JDBC-драйвер, который является реализацией JDBC API, специфичной для этой СУБД. Драйверы обычно предоставляются производителями СУБД или сторонними разработчиками. Драйвер преобразует вызовы JDBC API в команды, понятные конкретной базе данных.

4.Основные функции: JDBC API позволяет выполнять следующие операции с базой данных:

Установление соединения с базой данных.

Выполнение SQL-запросов (SELECT, INSERT, UPDATE, DELETE).

Вызов хранимых процедур и функций.

Обработка результатов запросов (например, ). Управление транзакциями (commit, rollback).

Получение метаданных о базе данных и ее структуре.

Компоненты JDBC:

JDBC API: Набор интерфейсов и классов в и . Основные интерфейсы включают:

: Представляет JDBC-драйвер.