Как избавиться от багов и NullPointerException в Java: две фишки, которые спасут ваш код

Как избавиться от багов и NullPointerException в Java: две фишки, которые спасут ваш код

Цель

В этой статье разберём два мощных инструмента Java, которые помогут писать чище, короче и безопаснее:
try-with-resources — автоматически закрывает ресурсы, избавляя от утечек памяти.
Optional — помогает избежать null и NullPointerException.
Если вы ещё не используете эти фишки, пора начинать!

Почему стоит избавиться от старых подходов?

Каждый Java-разработчик сталкивался с багами из-за забытых close(), null и NullPointerException. Они приводят к падению приложений, утечкам памяти и ночным деплойам.
Но с Java 7+ и 8+ появились механизмы, которые автоматически решают эти проблемы. Давайте разберёмся, как они работают!

Фишка 1. try-with-resources: забудьте про утечки ресурсов

Как это было раньше

Допустим, вам нужно прочитать файл. Старый подход выглядел так:

BufferedReader reader = null; try { reader = new BufferedReader(new FileReader("file.txt")); String line = reader.readLine(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } }

🔴 Минусы:

  • Код раздут, особенно в finally { close(); }.
  • Легко забыть закрыть ресурс → утечка памяти!
  • Если внутри try случится исключение, reader.close() может не выполниться.

Как стало с try-with-resources

Теперь код можно уместить в три строки:

try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { String line = reader.readLine(); } catch (IOException e) { e.printStackTrace(); }

Плюсы:

  • Код короче и чище.
  • Java автоматически закроет ресурс после выхода из try.
  • Нет риска утечки памяти.

Как это работает?

  • Все классы, которые реализуют AutoCloseable или Closeable, можно использовать в try-with-resources.
  • Java сама вызовет close(), когда try-блок завершится.

Где это полезно?

  • Чтение файлов (BufferedReader, FileReader).
  • Работа с базами данных (Connection, Statement).
  • Работа с сетевыми соединениями (Socket).

Фишка 2. Optional: избавьтесь от null и NPEФишка 2. Optional: избавьтесь от null и NPE

Как это было раньше

Вызываем метод, который возвращает null, и получаем NPE:

public String getUserName(User user) { return user.getName().toUpperCase(); // Если user == null → NullPointerException! }

Как это обходили?

public String getUserName(User user) { if (user != null && user.getName() != null) { return user.getName().toUpperCase(); } else { return "Unknown"; } }

🔴 Минусы:

  • Куча if-else, код разрастается.
  • Можно забыть проверить null и словить NPE.

Как стало с Optional

Теперь код короче и безопаснее:

public Optional<String> getUserName(User user) { return Optional.ofNullable(user) .map(User::getName) .map(String::toUpperCase); }

Как это работает?

1. Optional.ofNullable(user) — если user == null, создаётся пустой Optional.

2. .map(User::getName) — если user есть, вызываем getName(), иначе ничего не делаем.

3. .map(String::toUpperCase) — если getName() вернул null, дальше map() просто не выполняется.

Дополнительные возможности Optional

Возвращаем значение по умолчанию

String name = getUserName(user).orElse("Unknown");

Делаем что-то, только если значение есть

getUserName(user).ifPresent(name -> System.out.println("Hello, " + name));

Обрабатываем null, не боясь NPE

String name = getUserName(user).orElseThrow(() -> new RuntimeException("User not found"));

Где это полезно?

  • В бизнес-логике, где много данных могут быть null.
  • При работе с базами данных (findById() в Spring Data JPA возвращает Optional).
  • В API-ответах, где значение может быть необязательным.

Вывод

Эти две фишки Java помогают писать чище, короче и безопаснее:

try-with-resources закрывает ресурсы автоматически — забудьте про finally { close(); }.
Optional избавляет от null и NPE — код становится надёжнее.

Используете ли вы эти возможности в своём коде? Или продолжаете бороться с null и try-catch-finally? Пишите в комментариях! 👇

💡 Больше полезных фишек по Java и другим технологиям я публикую в своём Telegram-канале! Подписывайтесь, чтобы не пропустить новые разборы и советы: t.me/devnot3s 🚀

2
1
1 комментарий