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
История технологии сегодня — 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
История технологии сегодня — 05 мая

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

Бори́с Льво́вич Ро́зинг (23 апреля [5 мая] 1869, Санкт-Петербург, Российская империя — 20 апреля 1933, Архангельск, СССР) — русский физик, учёный, педагог, изобретатель телевидения, автор первых опытов по телевидению, за которые Русское техническое общество в 1912 г. присудило ему золотую медаль и премию имени К. Г. Сименса. Создал более 120 схем и систем телевизионных устройств.

Артур Леонард Ша́влов (англ. Arthur Leonard Schawlow; 5 мая 1921 — 28 апреля 1999) — американский физик, лауреат Нобелевской премии по физике (1981). Предложил ряд методов лазерной спектроскопии сверхвысокого разрешения, в частности внутридоплеровскую двухфотонную оптогальваническую спектроскопию (1979 г.), поляризационно-интермодуляционный метод (1981 г.) и другие.

Карл Ге́нрих Маркс (нем. Karl Heinrich Marx; 5 мая 1818, Трир, Рейнская провинция, Пруссия — 14 марта 1883, Лондон, Англия, Великобритания)немецкий философ, социолог, экономист, писатель, поэт, политический журналист, общественный деятель, историк. Наиболее известными его трудами являются «Манифест Коммунистической партии» (1848 год в соавторстве с Фридрихом Энгельсом) и «Капитал. Критика политической экономии» (1867—1883). Политическая и философская мысль Маркса оказала огромное влияние на последующую интеллектуальную, экономическую и политическую историю.


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

1927 — на Волховской ГЭС прошёл пуск первого советского генератора.

1951 — в Великобритании представлен игровой компьютер «Nimrod».

2025 — конец работы Skype.


#Biography #Birth_Date #Events #05мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
[Совет по Java #033]

Тема: Collections.emptyList() и List.of() возвращают иммутабельные списки.

Проблема: Методы Collections.emptyList(), Collections.singletonList(), а также фабричные методы List.of(), Set.of(), Map.of() (Java 9+) возвращают полностью неизменяемые (immutable) коллекции.

Они не поддерживают никакие модификации: ни изменение размера (add, remove, clear), ни замену элементов (set). Разработчики, привыкшие к изменяемым коллекциям, часто пытаются добавлять элементы в такие списки, получая UnsupportedOperationException во время выполнения.

Решение: Используйте иммутабельные коллекции только для read-only операций. Если нужна возможность модификации, всегда создавайте изменяемую коллекцию: new ArrayList<>() для пустого списка, new ArrayList<>(List.of(...)) или new ArrayList<>(Arrays.asList(...)) для предзаполненного. Для защиты API возвращайте иммутабельные коллекции, чтобы гарантировать, что вызывающий код не изменит внутреннее состояние объекта.


Объяснение: Иммутабельные коллекции (не путать с неизменяемыми обертками Collections.unmodifiableList()) спроектированы для максимальной производительности и безопасности памяти.

List.of() возвращает специализированные компактные реализации: для 0-2 элементов используются поля без массива, для большего количества — массив, но всегда без поддержки модификаций.

Все методы, изменяющие коллекцию, наследуются от AbstractList (в случае emptyList) или явно переопределены на выбрасывание исключения.


#Java #советы
👍7
import java.util.*;

public class ImmutableCollections {

public static void main(String[] args) {
//Антипаттерн: попытка модифицировать иммутабельные коллекции

// Collections.emptyList()
List<String> empty = Collections.emptyList();
try {
empty.add("item"); // UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("Cannot add to emptyList: " + e);
}

// List.of() (Java 9+)
List<String> of = List.of("A", "B", "C");
try {
of.add("D"); // UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("Cannot add to List.of: " + e);
}

try {
of.set(0, "Z"); // Тоже исключение! Даже замена элемента запрещена
} catch (UnsupportedOperationException e) {
System.out.println("Cannot set in List.of: " + e);
}

// Collections.singletonList()
List<String> singleton = Collections.singletonList("only");
try {
singleton.add("second"); // UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("Cannot add to singletonList: " + e);
}

//Правильное использование: read-only операции
List<String> readOnly = List.of("Red", "Green", "Blue");
for (String color : readOnly) {
System.out.print(color + " ");
}
System.out.println();
String first = readOnly.get(0);
boolean contains = readOnly.contains("Green");

//Решение 1: создание изменяемой копии
List<String> mutable = new ArrayList<>(readOnly);
mutable.add("Yellow");
mutable.set(0, "Cyan");
System.out.println("Mutable copy: " + mutable);

//Решение 2: создание изменяемой пустой коллекции
List<String> mutableEmpty = new ArrayList<>();
mutableEmpty.add("item"); // Работает

//Решение 3: защитное копирование в API
public static List<String> getInternalList() {
// Возвращаем иммутабельный список, чтобы защитить внутреннее состояние
return List.of("internal1", "internal2");
}

// Получатель, который хочет модифицировать:
List<String> fromApi = getInternalList();
List<String> myWorkingCopy = new ArrayList<>(fromApi);
myWorkingCopy.add("myItem");

// Различия между видами иммутабельных списков
List<String> oldStyleEmpty = Collections.emptyList(); // Пустой, иммутабельный
List<String> newStyleEmpty = List.of(); // То же самое, но короче

List<String> oldStyleSingle = Collections.singletonList("one");
List<String> newStyleSingle = List.of("one");

// List.of() не допускает null
try {
List.of("a", null, "b"); // NullPointerException
} catch (NullPointerException e) {
System.out.println("List.of() rejects nulls");
}

// Collections.emptyList() допускает null? Нет, при добавлении, но сам список может содержать null?
// Сам список пуст, но методы типа contains(null) работают без исключения
System.out.println("emptyList contains null: " + Collections.emptyList().contains(null)); // false
}
}


Объяснение: Иммутабельные коллекции (не путать с неизменяемыми обертками Collections.unmodifiableList()) спроектированы для максимальной производительности и безопасности памяти.

List.of() возвращает специализированные компактные реализации: для 0-2 элементов используются поля без массива, для большего количества — массив, но всегда без поддержки модификаций.

Все методы, изменяющие коллекцию, наследуются от AbstractList (в случае emptyList) или явно переопределены на выбрасывание исключения.


#Java #советы
👍8
Что выведет код?

import java.util.*;

public class Task050526 {
public static void main(String[] args) {
List<String> list1 = Collections.emptyList();
List<String> list2 = List.of();
List<String> list3 = new ArrayList<>(List.of("a", "b"));
List<String> list4 = list3.subList(0, 2);

list1.add("x");
list2.add("x");
list3.add("x");
list4.add("x");

System.out.println("Done");
}
}


#Tasks
👍4
Что такое Random класс? 🤓

Ответ:

java.util.Random
— это класс для генерации псевдослучайных чисел с более гибкими возможностями, чем Math.random().

Позволяет создавать экземпляры с заданным seed'ом (при одинаковом seed последовательность будет одинаковой).

Основные методы: nextInt() (любое целое), nextInt(int bound) (от 0 до bound-1), nextLong(), nextDouble(), nextBoolean(), nextBytes().

Для многопоточных сценариев есть потокобезопасный ThreadLocalRandom.


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