Java for Beginner
870 subscribers
1.01K photos
275 videos
14 files
1.69K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Обновление devforge.ru

Обновил визуал страниц, добавил боковую панель, удобные иконки и ссылки.

По мне - так стало заебумба 💃

Оцените?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍1🤯1🍾1
История технологии сегодня — 03 мая

ℹ️ Кто родился в этот день

Джордж Паджет Томсон (англ. George Paget Thomson; 3 мая 1892 — 10 сентября 1975) — английский учёный, физик-ядерщик, нобелевский лауреат (1937) — «за экспериментальное открытие дифракции электронов на кристаллах» (совместно с Джозефом Дэвиссоном).

Альфре́д Кастле́р (фр. Alfred Kastler; 3 мая 1902, Гебвиллер, Германская империя — 7 января 1984, Бандоль, Франция)французский физик, лауреат Нобелевской премии по физике в 1966 году «за открытие и разработку оптических методов исследования резонансов Герца в атомах».

Сти́вен Ва́йнберг (англ. Steven Weinberg; 3 мая 1933, Нью-Йорк — 23 июля 2021, Остин) — американский физик-теоретик, один из создателей единой теории электрослабого взаимодействия и Стандартной модели. Лауреат Нобелевской премии по физике в 1979 году (совместно с Шелдоном Ли Глэшоу и Абдусом Саламом) «за вклад в объединённую теорию слабых и электромагнитных взаимодействий между элементарными частицами, в том числе предсказание слабых нейтральных токов».


🌐 Знаковые события

2004 — новый интернет-червь «Sasser» поразил сотни тысяч персональных компьютеров по всему миру.


#Biography #Birth_Date #Events #03мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Наш проект поехал в прод! 🏝
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
🤣6
История технологии сегодня — 04 мая

ℹ️ Кто родился в этот день

Фриц Опель, с 1917 года — фон Опель (нем. Fritz von Opel; 4 мая 1899, Рюссельхайм (Main) — 8 апреля 1971, Санкт-Мориц, Самедан) — немецкий промышленник, мотогонщик, один из пионеров в области ракетной техники. Прозвище — Raketen-Fritz. Внук Адама Опеля, производителя швейных машин и велосипедов, основателя компании «Опель».


🌐 Знаковые события

1976 — запустили спутник LAGEOS-1 с капсулой времени.

2000 — первое появление вируса
«I love you».


#Biography #Birth_Date #Events #04мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Напоминаю, что продолжаю набор на обучение Java 🤓

Золотых гор не обещаю, но до уровня middle однозначно дойдете 🧑‍💻

Пишите в лс @oleborn
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Раздел 9. Исключения, логирование, отладка

Глава 1. Иерархия исключений (Exceptions)

Практика: Защитное программирование в «Библиотеке»

Подготовка: обновление модели данных

К этому моменту в проекте «Библиотека» должны существовать:
Класс Book с полями id (String или UUID), title, author, year, genres
Класс Library с коллекцией книг и методами поиска
Функциональность импорта/экспорта
Добавьте поле publishedDate типа LocalDate в Book для задачи с парсингом дат.


Часть 1. Автоматическое управление ресурсами

Проблема: ручное закрытие ресурсов
// Плохо: ресурс может остаться открытым при исключении
public List<Book> importFromJsonManual(String filename) {
FileReader reader = null;
try {
reader = new FileReader(filename);
// ... парсинг ...
return parseBooks(reader);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (reader != null) {
try {
reader.close(); // Может бросить исключение, подавляя основное
} catch (IOException e) {
// игнорируем
}
}
}
}


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

Решение: try-with-resources
// Хорошо: автоматическое закрытие, правильная обработка исключений
public List<Book> importFromJson(String filename) {
try (FileReader reader = new FileReader(filename);
BufferedReader buffered = new BufferedReader(reader)) {

StringBuilder json = new StringBuilder();
String line;
while ((line = buffered.readLine()) != null) {
json.append(line);
}
return parseBooks(json.toString());

} catch (IOException e) {
throw new LibraryException("Не удалось прочитать файл: " + filename, e);
}
}

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

Ресурсы в скобках после try должны реализовывать AutoCloseable
Закрываются в обратном порядке создания: buffered, затем reader
Если исключение в try и при закрытии — основное сохраняется, вторичное прицепляется через Suppressed
Можно объявлять ресурс вне try, если он effectively final

Несколько ресурсов

public void exportToJson(String inputFilename, String outputFilename) {
try (BufferedReader reader = Files.newBufferedReader(Path.of(inputFilename));
BufferedWriter writer = Files.newBufferedWriter(Path.of(outputFilename))) {

String json = reader.readLine();
List<Book> books = parseBooks(json);
String formatted = formatBooks(books);
writer.write(formatted);

} catch (IOException e) {
throw new LibraryException("Ошибка при копировании данных", e);
}
}



Часть 2. Собственное исключение

Зачем нужно своё исключение
Семантическая ясность: LibraryException говорит о проблеме в предметной области
Единая точка обработки в верхних слоях
Возможность добавить контекст (ID книги, имя файла)
Реализация: unchecked-исключение

Создайте класс LibraryException:
public class LibraryException extends RuntimeException {

public LibraryException(String message) {
super(message);
}

public LibraryException(String message, Throwable cause) {
super(message, cause);
}

public LibraryException(String message, String bookId, Throwable cause) {
super(message + " [книга: " + bookId + "]", cause);
}
}


Почему unchecked:
Ошибки библиотеки обычно не восстановимы на месте
Не загромождает сигнатуры методов throws
В Stream API и лямбдах не требует обёртки (в отличие от checked)

Использование в проекте
public Book findBookOrThrow(String bookId) {
return findById(bookId)
.orElseThrow(() -> new LibraryException("Книга не найдена", bookId, null));
}



#Java #для_новичков #beginner #exception #практика
👍6
Часть 3. Многоцелевой перехват

Сценарий:
разные I/O-ошибки — одинаковая реакция
public List<Book> loadFromMultipleSources(String jsonPath, String csvPath) {
List<Book> result = new ArrayList<>();

try {
result.addAll(loadJson(jsonPath));
} catch (FileNotFoundException | NoSuchFileException e) {
// Файла нет — не критично, продолжаем с CSV
System.err.println("JSON не найден, пробуем CSV: " + e.getMessage());
} catch (IOException e) {
throw new LibraryException("Ошибка чтения JSON", e);
}

try {
result.addAll(loadCsv(csvPath));
} catch (FileNotFoundException | NoSuchFileException e) {
System.err.println("CSV не найден: " + e.getMessage());
} catch (IOException e) {
throw new LibraryException("Ошибка чтения CSV", e);
}

if (result.isEmpty()) {
throw new LibraryException("Не удалось загрузить книги ни из одного источника");
}

return result;
}


Правила multi-catch:
Типы должны быть несовместимыми (нет иерархии)
Переменная e effectively final внутри блока
Нельзя вызвать метод, который есть не во всех типах (без приведения)


Часть 4. Checked-исключения в Stream API

Проблема: Stream.map() не принимает throws
// Не компилируется: parseDate бросает checked DateTimeParseException
public List<LocalDate> parsePublicationDates(List<String> dateStrings) {
return dateStrings.stream()
.map(this::parseDate) // Ошибка: unreported exception
.collect(Collectors.toList());
}

private LocalDate parseDate(String s) throws DateTimeParseException {
return LocalDate.parse(s); // checked в Java 8, но...
}


Уточнение: DateTimeParseException на самом деле unchecked (наследник DateTimeException). Возьмём более показательный пример с реальным checked-исключением — чтение из файла внутри stream:
// Реальная проблема: Files.readString бросает IOException
public List<String> loadDescriptions(List<Path> paths) {
return paths.stream()
.map(Files::readString) // Ошибка: IOException не обработана
.collect(Collectors.toList());
}


Решение 1: обёртка внутри лямбды
public List<String> loadDescriptionsWrapped(List<Path> paths) {
return paths.stream()
.map(path -> {
try {
return Files.readString(path);
} catch (IOException e) {
throw new LibraryException("Не удалось прочитать: " + path, e);
}
})
.collect(Collectors.toList());
}


Недостаток: загромождает код, повторяется в каждой лямбде.

Решение 2: вспомогательный метод-обёртка
// Утилитный метод для оборачивания checked в unchecked
@FunctionalInterface
public interface ThrowingFunction<T, R> {
R apply(T t) throws Exception;
}

public static <T, R> Function<T, R> wrap(ThrowingFunction<T, R> throwing) {
return t -> {
try {
return throwing.apply(t);
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new LibraryException("Ошибка в потоковой операции", e);
}
};
}


Использование:
public List<String> loadDescriptionsClean(List<Path> paths) {
return paths.stream()
.map(wrap(Files::readString))
.collect(Collectors.toList());
}


Решение 3: специализированный обёртчик для Optional
public Optional<Book> parseBookFromJson(String json) {
return Optional.ofNullable(json)
.map(wrap(this::parseBook))
.orElseThrow(() -> new LibraryException("Пустой JSON"));
}

private Book parseBook(String json) throws JsonParseException {
// парсинг...
}


Часть 5. Защитные проверки аргументов

Objects.requireNonNull
public void addBook(Book book) {
Objects.requireNonNull(book, "Книга не может быть null");
Objects.requireNonNull(book.getTitle(), "Название не может быть null");

if (book.getYear() < 1450 || book.getYear() > Year.now().getValue() + 1) {
throw new IllegalArgumentException("Недопустимый год: " + book.getYear());
}

books.add(book);
}


#Java #для_новичков #beginner #exception #практика
👍5
Преимущества:
Стандартный метод — читается как утверждение
Сообщение об ошибке встроено в исключение
Компактнее ручной проверки if (x == null) throw ...

Вариант с кастомным сообщением
public Book findById(String id) {
Objects.requireNonNull(id, () -> "ID книги не может быть null, доступные: " + listIds());
// ленивое вычисление сообщения — вызывается только при ошибке
return internalFind(id);
}


Часть 6. Optional и явные исключения

Поиск с гарантией результата
public Book getBook(String bookId) {
return findById(bookId)
.orElseThrow(() -> new LibraryException("Книга не найдена", bookId, null));
}


Альтернативы:
Цепочка с промежуточными проверками
public LocalDate getPublicationDate(String bookId) {
return findById(bookId)
.map(Book::getPublishedDate)
.filter(Objects::nonNull)
.orElseThrow(() -> new LibraryException("Дата неизвестна", bookId, null));
}



Интеграция в проект «Библиотека»

Обновлённый класс Library с защитными приёмами
public class Library {
private final List<Book> books = new ArrayList<>();

public void addBook(Book book) {
Objects.requireNonNull(book, "Книга не может быть null");
Objects.requireNonNull(book.getId(), "ID книги не может быть null");

if (findById(book.getId()).isPresent()) {
throw new LibraryException("Книга с ID " + book.getId() + " уже существует");
}

books.add(book);
}

public Book getBook(String id) {
Objects.requireNonNull(id, "ID не может быть null");
return findById(id)
.orElseThrow(() -> new LibraryException("Книга не найдена", id, null));
}

public List<Book> importFromJson(String filename) {
Objects.requireNonNull(filename, "Имя файла не может быть null");

try (BufferedReader reader = Files.newBufferedReader(Path.of(filename))) {
String json = reader.lines().collect(Collectors.joining());
return parseBooks(json);
} catch (FileNotFoundException | NoSuchFileException e) {
throw new LibraryException("Файл не найден: " + filename, e);
} catch (IOException e) {
throw new LibraryException("Ошибка чтения файла: " + filename, e);
}
}

public List<Book> importFromMultipleSources(List<String> filenames) {
Objects.requireNonNull(filenames, "Список файлов не может быть null");

return filenames.stream()
.filter(Objects::nonNull)
.map(wrap(this::importFromJson))
.flatMap(List::stream)
.collect(Collectors.toList());
}

private Optional<Book> findById(String id) {
return books.stream()
.filter(b -> b.getId().equals(id))
.findFirst();
}

private List<Book> parseBooks(String json) {
// реализация парсинга
}
}



Практические задания

Задача 1: try-with-resources для базы данных
Предположим, что Library теперь использует Connection для JDBC. Обёрните операции в try-with-resources. Обработайте SQLException через LibraryException.

Задача 2: иерархия исключений
Расширьте LibraryException:
BookNotFoundException — для findById
DuplicateBookException — для addBook
ImportException — для операций импорта
Все наследуют LibraryException. Покажите multi-catch для разных типов импорта.

Задача 3: обёртка для Stream с результатом
Создайте метод parseDatesWithFallback:
public List<LocalDate> parseDatesWithFallback(List<String> inputs) {
// Парсит даты, при ошибке возвращает LocalDate.MIN вместо исключения
// Используйте обёртку, возвращающую Optional<LocalDate>
}


Задача 4: защита от null во всём API
Проверьте все публичные методы Library. Добавьте Objects.requireNonNull где аргументы не должны быть null. Документируйте в Javadoc, какие методы принимают null (например, findById(null) → LibraryException vs orElse(null)).


#Java #для_новичков #beginner #exception #практика
👍7
Что выведет код?

class Parent040526 {
static void print() {
System.out.println("Parent");
}
}

class Child040526 extends Parent040526 {
static void print() {
System.out.println("Child");
}
}

public class Task040526 {
public static void main(String[] args) {
Parent040526 obj1 = new Parent040526();
Parent040526 obj2 = new Child040526();
Child040526 obj3 = new Child040526();

obj1.print();
obj2.print();
obj3.print();
}
}


#Tasks
👍3
Новая статья на Хабр, на вашу оценку - https://habr.com/ru/articles/1031336/

Пишите мнение и комменты))

Ну лайков там и кармы накидайте чтоли)))💃
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍1
Что такое Math класс? Какие полезные методы есть? 🤓

Ответ:

java.lang.Math
— это финальный класс с статическими методами для математических операций.

Полезные методы:
abs() (модуль), min(), max() (минимум/максимум), round(), ceil(), floor() (округление), random() (псевдослучайное число от 0 до 1), sqrt(), pow(), sin(), cos(), tan(), log(), exp().

Также содержит константы PI и E. Для криптостойких случайных чисел используют java.security.SecureRandom.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6