Генератор кода Java — ИИ-инструмент нейросети Аливия. Напишет DTO, сервис, REST-контроллер на Spring Boot, работу с базой через JDBC и тесты JUnit по описанию задачи. Пришлите стек-трейс — объяснит причину исключения и покажет, что поправить, а для тяжёлых мест предложит Stream API, подходящую коллекцию и корректную обработку транзакций.
Работает онлайнРусский и другие языкиТест бесплатно, без регистрацииБез VPNДоступ 24/7Голосовой ввод и файлы
Зарегистрируйтесь и подтвердите почту — начислим ещё 30 000 символов на 30 дней.ЗарегистрироватьсяОнлайн
Программистам · ИИ-инструмент нейросети Аливия
Конструктор кода на Java
Укажите версию Java и фреймворк, опишите задачу или вставьте стектрейс — бот напишет или починит код.
Ещё настройки
Запрос подставится в поле чата — его можно поправить перед отправкой.
Давай создадим простой REST-контроллер на Spring Boot для работы с заказами. Мы будем использовать Maven в качестве сборщика.
1. Файл pom.xml
Сначала необходимо добавить зависимости в pom.xml. В Spring Boot включена основная библиотека, но нужно явно указать Spring Web для работы с REST:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>orders</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>21</java.version>
<spring.version>3.0.0</spring.version> <!-- Используй актуальную версию Spring Boot -->
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>2. Файл Order.java
Создадим модель для заказа:
package com.example.orders;
import java.time.LocalDate;
public class Order {
private Long id;
private String client;
private double amount;
private LocalDate date;
public Order(Long id, String client, double amount, LocalDate date) {
this.id = id;
this.client = client;
this.amount = amount;
this.date = date;
}
// Геттеры и сеттеры
public Long getId() { return id; }
public String getClient() { return client; }
public double getAmount() { return amount; }
public LocalDate getDate() { return date; }
}3. Файл OrderNotFoundException.java
Создадим исключение для обработки случаев, когда заказ не найден:
package com.example.orders;
public class OrderNotFoundException extends RuntimeException {
public OrderNotFoundException(Long id) {
super("Заказ с ID " + id + " не найден.");
}
}4. Файл OrderController.java
Теперь создадим REST-контроллер:
package com.example.orders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/orders")
public class OrderController {
private final Map<Long, Order> orderRepository = new HashMap<>();
private long currentId = 1;
@GetMapping
public List<Order> getAllOrders() {
return new ArrayList<>(orderRepository.values());
}
@GetMapping("/{id}")
public ResponseEntity<Order> getOrderById(@PathVariable Long id) {
Order order = orderRepository.get(id);
if (order == null) {
throw new OrderNotFoundException(id);
}
return ResponseEntity.ok(order);
}
@PostMapping
public Order createOrder(@RequestBody Order order) {
order = new Order(currentId++, order.getClient(), order.getAmount(), LocalDate.now());
orderRepository.put(order.getId(), order);
return order;
}
}Объяснение подхода
- Модель Order: Это класс, представляющий данные заказа. Он содержит поля для ID, клиента, суммы и даты. Мы используем геттеры для доступа к полям.
- Исключение OrderNotFoundException: Создано для обработки случаев, когда заказ с указанным ID не найден. Исключения позволяют проще обрабатывать ошибки и предоставлять пользователю понятные сообщения.
- REST-контроллер OrderController:
- GetMapping: Метод
getAllOrdersвозвращает все заказы, аgetOrderByIdвозвращает заказ по ID. Если заказа нет, выбрасывается исключение. - PostMapping: Метод
createOrderсоздает новый заказ, увеличивает ID и хранит его в памяти.
- GetMapping: Метод
Где это может сломаться
- Потеря данных: Все заказы хранятся в памяти, и при перезапуске приложения данные будут потеряны. Для реального приложения лучше использовать базу данных.
- Необработанные исключения: Если клиент отправит неправильный запрос (например, некорректный JSON), это может привести к ошибкам, которые потребуется обрабатывать.
- Проблемы с параллелизмом: Если несколько клиентов будут одновременно добавлять заказы, это может привести к конфликтам (например, одинаковые ID).
Этот пример поможет тебе начать работу с Spring Boot и REST. Если будут вопросы, обращайся!
Причина: исключение NullPointerException, последний Caused by — this.prices is null на строке return prices.get(sku);.
Исправленный код:
// PriceService.java
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
public class PriceService {
private Map<String, BigDecimal> prices;
// Конструктор инициализирует prices
public PriceService() {
this.prices = new HashMap<>(); // Инициализация HashMap
}
public Optional<BigDecimal> find(String sku) {
return Optional.ofNullable(prices.get(sku)); // Используем Optional для обработки отсутствующего значения
}
// Метод для добавления цен для тестирования
public void addPrice(String sku, BigDecimal price) {
prices.put(sku, price);
}
}Почему выбран такой подход:
- Инициализация: В конструкторе мы инициализируем
prices, чтобы избежатьNullPointerException. Это значит, что перед использованием объекта нужно его подготовить. - Optional: Используем
Optional<BigDecimal>для возвращаемого значения, чтобы явно показать, что результат может быть отсутствующим (например, если артикул не найден). Это позволяет избежать явной обработкиnull. - Метод addPrice: Добавлен для тестирования, чтобы мы могли легко добавлять цены в
prices.
Где его легко сломать:
- Если не инициализировать
prices, произойдетNullPointerException. - Если не использовать
Optional, клиент кода будет вынужден проверять наnull, что менее удобно и может привести к ошибкам, если забыть это сделать.
Таким образом, мы сделали код более безопасным и удобным для использования.
// Product.java
import java.util.Objects;
public class Product {
private String name;
private double price;
private int quantity;
public Product(String name, double price, int quantity) {
this.name = name;
this.price = price;
this.quantity = quantity;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public int getQuantity() {
return quantity;
}
@Override
public String toString() {
return name + " (Цена: " + price + ", Остаток: " + quantity + ")";
}
}// Main.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Product> products = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader("products.csv"))) {
String line;
br.readLine(); // Пропустить заголовок
while ((line = br.readLine()) != null) {
String[] parts = line.split(";");
if (parts.length != 3) {
throw new IllegalArgumentException("Неверный формат строки: " + line);
}
String name = parts[0];
double price = Double.parseDouble(parts[1]);
int quantity = Integer.parseInt(parts[2]);
products.add(new Product(name, price, quantity));
}
} catch (IOException e) {
System.err.println("Ошибка чтения файла: " + e.getMessage());
} catch (NumberFormatException e) {
System.err.println("Ошибка преобразования числа: " + e.getMessage());
}
products.stream()
.filter(product -> product.getQuantity() < 5)
.sorted(Comparator.comparingDouble(Product::getPrice))
.forEach(System.out::println);
}
}Отлично, начнем наше тренировочное собеседование по Java на тему «Stream API и коллекции».
Вопрос 1:
Что такое коллекции в Java и какие основные интерфейсы коллекций вы знаете? Объясните их назначение.
// src/test/java/BonusCalculatorTest.java
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class BonusCalculatorTest {
private final BonusCalculator calculator = new BonusCalculator();
@Test
public void testBonusWithNormalPurchases() {
assertEquals(0, calculator.bonus(0, false));
assertEquals(10, calculator.bonus(1000, false));
assertEquals(20, calculator.bonus(2000, false));
}
@Test
public void testBonusWithVIPPurchases() {
assertEquals(0, calculator.bonus(0, true));
assertEquals(20, calculator.bonus(1000, true));
assertEquals(40, calculator.bonus(2000, true));
}
@Test
public void testBonusWithEdgeCases() {
assertEquals(0, calculator.bonus(999, false));
assertEquals(0, calculator.bonus(999, true));
assertEquals(10, calculator.bonus(1000, false));
assertEquals(20, calculator.bonus(1000, true));
}
@Test
public void testBonusWithNegativePurchases() {
IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () -> {
calculator.bonus(-1, false);
});
assertEquals("purchases < 0", thrown.getMessage());
}
}// build.gradle
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
}
test {
useJUnitPlatform()
}Причина: исключение NoSuchBeanDefinitionException, последний Caused by: No qualifying bean of type 'shop.order.OrderRepository' available.
Исправленный код
// OrderController.java
package shop.order;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
@RestController
public class OrderController {
private final OrderRepository orderRepository;
}// OrderRepository.java
package shop.order;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
}Пояснение
- Причина ошибки: Spring не может создать экземпляр
OrderController, потому что не может найти подходящий "блок" (bean) дляOrderRepository. Это происходит, когда Spring не знает, как создать экземпляр нужного класса. - Исправления:
- Я добавил аннотацию
@Repositoryк интерфейсуOrderRepository. Это говорит Spring, что этот интерфейс является компонентом, который взаимодействует с базой данных, и он должен управлять его жизненным циклом.
- Я добавил аннотацию
- Почему выбран такой подход:
- Использование аннотации
@RequiredArgsConstructorиз Lombok позволяет автоматически создать конструктор для всех финальных полей, что делает код более читаемым. - Аннотация
@Repositoryпозволяет Spring автоматически регистрировать интерфейс как компонент, что решает проблему с отсутствием bean.
- Использование аннотации
- Где это можно сломать:
- Если забыть добавить аннотацию
@Repository, Spring не сможет найтиOrderRepository. - Если
Orderне будет корректно определен или не будет иметь аннотацию@Entity, это приведет к ошибкам при работе с базой данных. - Убедитесь, что пакет
shop.orderсканируется Spring для поиска компонентов, иначе Spring не сможет их обнаружить.
- Если забыть добавить аннотацию
Ответы получены 28.09.2026 в этом чате и приведены без правок. Выделено то, чего не было в запросе.
Что уточнить в запросе про Java
Код на Java сильно зависит от версии и окружения. Эти три уточнения снимают большую часть правок.
| Что указать | Почему это важно |
|---|---|
| Версия Java | Записи, var, switch-выражения и стримы доступны не везде |
| Фреймворк и сборщик | Spring Boot с Maven и «чистая» Java дают разный код |
| Что делать с ошибками | Пробрасывать, логировать или возвращать результат — решает архитектура |
| Нужны ли тесты | JUnit-тест к методу проще написать сразу, чем дописывать потом |
Мастерство Unit-тестирования
Unit-тесты — основа надежного программирования. Поисковые системы ценят контент, который помогает разработчикам писать качественные тесты. Аливия — это не только конструктор java кода, но и ваш личный эксперт по JUnit и Mockito.
Как Аливия помогает с тестами:
- Генерация заглушек (Mocks): Просто попросите создать мок-объект для любого интерфейса.
- Проверка исключений: Аливия сгенерирует тесты, которые корректно проверяют выброс исключений.
- Тестирование Spring-компонентов: Генерация тестов с использованием @WebMvcTest или @DataJpaTest.
Оптимизация JVM и производительность
Опытные Java-разработчики знают, что чистый код — это только половина дела. Важно, как он выполняется на JVM. Аливия помогает писать код, который максимально эффективно использует ресурсы.
Ключевые аспекты оптимизации:
- Stream API: Нейросеть всегда предложит использовать Stream API вместо устаревших циклов, что часто приводит к более производительному коду.
- Concurrency: При работе с многопоточность java Аливия использует современные примитивы (например, Atomic* классы или ReentrantLock), избегая дорогостоящих блокировок.
- Memory Management: Подсказки по правильному использованию коллекций и избеганию утечек памяти.
Что указать в запросе, чтобы код собрался
Java — язык с длинной историей и несколькими живыми версиями одновременно. Код, написанный без привязки к вашему окружению, чаще всего не компилируется.
- Версия JDK. 17 и 21 — версии с долгой поддержкой; на них доступны records, switch-выражения и sealed-классы, которых нет в 8-й.
- Фреймворк с версией. Spring Boot 3 требует Java 17 и пакетов
jakarta.*вместоjavax.*— без этого уточнения импорты будут от второй ветки. - Сборщик. Maven или Gradle: от этого зависит, в каком виде давать зависимости.
- Слой приложения. Контроллер, сервис, репозиторий, утилита — разные аннотации и разный стиль обработки ошибок.
- Принятые в команде практики. Lombok, конструкторная инъекция, records для DTO, checked или unchecked исключения.
Готовая формула запроса: «Java 21, Spring Boot 3.3, Gradle, Lombok. Нужен REST-контроллер и сервис для загрузки CSV: валидация файла, парсинг в список DTO, сохранение пачками по 500 записей, понятные ошибки в ответе. Приложи тест на JUnit 5 с моками».
Какие задачи Java-разработчики отдают нейросети
По логам чата видно закономерность: чем рутиннее задача, тем выше отдача. Список того, что экономит время лучше всего:
- Шаблонный код. DTO, мапперы, конфигурации, билдеры, эквалсы и хэшкоды.
- Тесты по описанию поведения. «Проверить, что при пустом списке кидается исключение» — и тест готов вместе с моками.
- Разбор стектрейса. Пришлите ошибку целиком: чаще всего причина называется с первого раза.
- Перевод между стилями. Императивный цикл в Stream API и обратно, замена устаревших API на современные.
- Объяснение чужого кода. Легаси-метод на двести строк — по частям, с описанием, что делает каждый блок.
Всё, что связано с многопоточностью, датами и часовыми поясами, проверяйте тестами обязательно: код будет выглядеть корректным, а ошибка проявится только под нагрузкой или на границе перевода времени.
Как проверять сгенерированный Java-код?
- Соберите проект. Минута, которая отсекает половину проблем: устаревшие методы и несуществующие импорты видно сразу.
- Прогоните тесты. Свои, а не только те, что написала модель.
- Проверьте обработку ошибок. Таймауты, повторы, поведение при пустом ответе — это пишется, только если попросить.
- Посмотрите на безопасность. Параметризованные запросы, отсутствие секретов в коде, корректная работа с файлами.
- Сверьте с код-стайлом. Линтер и форматтер проекта — последний шаг перед коммитом.
Полезный приём для больших задач: сначала попросите план — какие классы нужны и как они связаны. Если архитектура верная, код почти всегда получится рабочим; если нет — вы сэкономите час на переписывании.
Java для учёбы: как разбираться, а не списывать
Значительная часть запросов на этой странице — учебные задачи. Готовый ответ закрывает лабораторную, но не помогает на экзамене; разбор работает иначе.
- Просите объяснение, а не решение. «Объясни, почему здесь нужен интерфейс, а не абстрактный класс» — и тема закрывается целиком.
- Отправляйте свой код. «Вот моя реализация, найди ошибку и объясни правилом» полезнее, чем чужой идеальный вариант.
- Спрашивайте про альтернативы. Три способа решить одну задачу и их компромиссы — это и есть понимание языка.
- Разбирайте ошибки компиляции. Пришлите текст ошибки: вы научитесь читать их сами уже через несколько разборов.
- Готовьтесь к вопросам. Попросите десять вопросов по вашей теме, как на защите лабораторной, и ответьте на них своими словами.
Готовая формула запроса: «Вот моя реализация связного списка на Java. Не переписывай код — найди ошибки, объясни каждую правилом языка и задай мне пять вопросов по теме, которые может задать преподаватель».
Как объяснить нейросети чужой код?
Разбор легаси — одна из самых частых задач в реальной работе, и здесь есть свои приёмы.
- Давайте по частям. Метод целиком, а не весь класс: так разбор точнее.
- Скажите, что непонятно. «Не могу понять, зачем здесь синхронизация» лучше, чем «объясни код».
- Приложите контекст. Сигнатуры вызываемых методов, если они важны для логики.
- Просите схему. «Опиши поток данных по шагам» помогает больше построчного перевода.
- Спросите про риски. Что сломается, если изменить этот участок, — самый полезный вопрос перед рефакторингом.
Готовая формула запроса: «Вот метод из легаси-проекта на Java 8. Объясни по шагам, что он делает, какие есть побочные эффекты и что сломается, если вынести часть логики в отдельный метод».
Подготовка к собеседованию по Java
- Базовые темы. Коллекции, многопоточность, устройство памяти, исключения — их спрашивают почти всегда.
- Вопросы на понимание. Не «что такое HashMap», а «что произойдёт при коллизии и почему важен корректный hashCode».
- Живое кодирование. Потренируйтесь писать код и объяснять ход мысли вслух одновременно.
- Разбор своих проектов. Будьте готовы объяснить принятые решения и их альтернативы.
Полезный запрос: «задай мне 15 вопросов по Java уровня middle с уклоном в коллекции и многопоточность. После каждого моего ответа разбирай его и дополняй тем, что я упустил».
Цифры и факты
Что важно указать в запросе.
- С 2018 года новые версии Java выходят каждые полгода, а версии с долгой поддержкой — раз в два года.
- Разница между Java 8 и современными версиями велика: без указания версии легко получить код, который не соберётся в вашем проекте.
- Актуальных номеров версий библиотек у нейросети нет — зависимости сверяйте с документацией и файлом сборки.
- Списывается только ответ нейросети: ваш код и стек-трейсы не тарифицируются, поэтому присылайте их целиком.
Кейсы
Задачи, которые чаще всего приносят генератору кода на Java.
Запрос: «Сделай контроллер для заявок: сохранение в базу, валидация полей и понятный ответ при ошибке»

// ─── запрос: record избавляет от геттеров и конструкторов ───
public record OrderRequest( @NotBlank @Size(max = 80) String client, @Email String email, @Positive BigDecimal amount) { } // ─── сущность ───
@Entity
@Table(name = "orders")
public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String client; private String email; private BigDecimal amount; private Instant createdAt = Instant.now(); // геттеры и сеттеры опущены
} public interface OrderRepository extends JpaRepository<Order, Long> { } // ─── контроллер ───
@RestController
@RequestMapping("/api/orders")
public class OrderController { private final OrderRepository repo; public OrderController(OrderRepository repo) { // внедрение через конструктор this.repo = repo; } @PostMapping @ResponseStatus(HttpStatus.CREATED) public Order create(@Valid @RequestBody OrderRequest req) { Order order = new Order(); order.setClient(req.client()); order.setEmail(req.email()); order.setAmount(req.amount()); return repo.save(order); } @GetMapping("/{id}") public Order one(@PathVariable Long id) { return repo.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Заявка не найдена")); }
} // ─── один обработчик на все ошибки валидации ───
@RestControllerAdvice
class ErrorHandler { @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) Map<String, String> invalid(MethodArgumentNotValidException e) { return e.getBindingResult().getFieldErrors().stream() .collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage, (a, b) -> a)); }
}Запрос: «Нужен мод для Fabric 1.21: своя команда и предмет, который лечит игрока при использовании»

public class HealingApple extends Item { public HealingApple(Settings settings) { super(settings); } @Override public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) { if (!world.isClient) { // логика только на сервере player.heal(6.0F); // три сердца player.addStatusEffect( new StatusEffectInstance(StatusEffects.REGENERATION, 200, 1)); player.getItemCooldownManager().set(this, 600); // 30 секунд отката player.getStackInHand(hand).decrement(1); world.playSound(null, player.getBlockPos(), SoundEvents.ENTITY_PLAYER_LEVELUP, SoundCategory.PLAYERS, 1.0F, 1.2F); } return TypedActionResult.success(player.getStackInHand(hand), world.isClient); }
} public class ExampleMod implements ModInitializer { public static final String MOD_ID = "examplemod"; public static final Item HEALING_APPLE = new HealingApple(new Item.Settings().maxCount(16)); @Override public void onInitialize() { Registry.register(Registries.ITEM, Identifier.of(MOD_ID, "healing_apple"), HEALING_APPLE); // /heal — восстанавливает здоровье, доступна с уровня оператора 2 CommandRegistrationCallback.EVENT.register((dispatcher, registry, env) -> dispatcher.register(CommandManager.literal("heal") .requires(source -> source.hasPermissionLevel(2)) .executes(context -> { ServerPlayerEntity player = context.getSource().getPlayerOrThrow(); player.setHealth(player.getMaxHealth()); player.getHungerManager().setFoodLevel(20); context.getSource().sendFeedback( () -> Text.literal("Здоровье восстановлено"), false); return 1; }))); }
}Запрос: «Есть список заказов. Нужна сумма по каждому городу среди оплаченных и топ-3 по выручке»

record Order(String city, String status, BigDecimal amount) { } List<Order> orders = repository.findAll(); // сумма по городам среди оплаченных
Map<String, BigDecimal> byCity = orders.stream() .filter(o -> "paid".equals(o.status())) .collect(Collectors.groupingBy( Order::city, TreeMap::new, // сразу отсортировано по названию Collectors.reducing(BigDecimal.ZERO, Order::amount, BigDecimal::add))); byCity.forEach((city, sum) -> System.out.printf("%-16s %,12.2f%n", city, sum)); // топ-3 городов по выручке
String leaders = byCity.entrySet().stream() .sorted(Map.Entry.<String, BigDecimal>comparingByValue().reversed()) .limit(3) .map(e -> e.getKey() + " (" + e.getValue() + ")") .collect(Collectors.joining(", ")); System.out.println("Лидеры: " + leaders); // количество, средний чек и максимум — одним проходом
DoubleSummaryStatistics stats = orders.stream() .filter(o -> "paid".equals(o.status())) .mapToDouble(o -> o.amount().doubleValue()) .summaryStatistics(); System.out.printf("Заказов: %d, средний чек: %.2f, максимум: %.2f%n", stats.getCount(), stats.getAverage(), stats.getMax());Запрос: «Нужно опросить 500 адресов по HTTP. Обычный пул потоков всё вешает — перепиши на виртуальные потоки»

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Duration;
import java.util.List;
import java.util.concurrent.*; public class SiteChecker { record Result(String url, int status, long ms) { } public static void main(String[] args) throws Exception { List<String> urls = Files.readAllLines(Path.of("urls.txt")); HttpClient http = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(5)) .followRedirects(HttpClient.Redirect.NORMAL) .build(); // Поток на задачу. Виртуальный поток стоит около килобайта памяти, // поэтому пул на 500 соединений держать не нужно. try (ExecutorService pool = Executors.newVirtualThreadPerTaskExecutor()) { List<Future<Result>> futures = urls.stream() .map(url -> pool.submit(() -> check(http, url))) .toList(); for (Future<Result> future : futures) { try { Result r = future.get(); System.out.printf("%-40s %3d %5d мс%n", r.url(), r.status(), r.ms()); } catch (ExecutionException e) { System.out.println("упал: " + e.getCause().getMessage()); } } } // закрытие ждёт завершения всех задач } static Result check(HttpClient http, String url) throws Exception { long start = System.nanoTime(); HttpRequest request = HttpRequest.newBuilder(URI.create(url)) .timeout(Duration.ofSeconds(10)) .method("HEAD", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse<Void> response = http.send(request, HttpResponse.BodyHandlers.discarding()); return new Result(url, response.statusCode(), (System.nanoTime() - start) / 1_000_000); }
}Запрос: «Падает NullPointerException: Cannot invoke String.trim() because the return value of Map.get(Object) is null. Что не так»

/* Начиная с Java 14 сообщение прямо называет виновника: «because the return value of java.util.Map.get(Object) is null» — значит, в карте нет такого ключа, а результат сразу пошёл в .trim(). Было: String city = settings.get("city").trim().toUpperCase();
*/ // ─── вариант 1: значение по умолчанию ───
String city = settings.getOrDefault("city", "").trim().toUpperCase(); // ─── вариант 2: пустое значение недопустимо — падаем с внятным текстом ───
String city = Optional.ofNullable(settings.get("city")) .map(String::trim) .filter(value -> !value.isEmpty()) .orElseThrow(() -> new IllegalStateException( "В настройках не задан параметр city")); // ─── вариант 3: не пускать null внутрь объекта вообще ───
public record Settings(Map<String, String> values) { public Settings { Objects.requireNonNull(values, "values"); values = Map.copyOf(values); // неизменяемая копия, null не примет } public String require(String key) { String value = values.get(key); if (value == null || value.isBlank()) { throw new IllegalArgumentException("Нет обязательной настройки: " + key); } return value.trim(); }
} // Итог: NPE лечится не россыпью проверок if (x != null) по всему коду,
// а тем, что null не попадает в объект при его создании.Опрос
Генератор кода Java: частые вопросы
Какой код можно получить?
Как разобрать исключение?
Можно ли доверять коду без проверки?
Помогает ли с производительностью?
Можно ли получить тесты к своему классу?
Знает ли инструмент свежие версии библиотек?
Подойдёт ли для обучения?
Можно ли присылать код из рабочего проекта?
Помогает ли с миграцией на новую версию Java?
Помогает ли инструмент с многопоточностью в Java?
Итог
Внедрение искусственного интеллекта в процесс разработки — это не дань моде, а необходимость, продиктованная требованиями рынка. Генератор кода на Java от Аливии — это ваш надежный партнер в мире высоконагруженных и сложных систем. Он позволяет вам не просто писать код, а создавать архитектуру, фокусироваться на бизнес-логике и расти как профессионалу. Начните использовать Аливию сегодня, чтобы завтра ваша команда была на шаг впереди конкурентов.