## Why is this an issue?

`Optional` acts as a container object that may or may not contain a non-null value. It is introduced in Java 8 to help avoid `NullPointerException`. It provides methods to check if a value is present and retrieve the value if it is present.

`Optional` is used instead of `null` values to make the code more readable and avoid potential errors.

It is a bad practice to use `null` with `Optional` because it is unclear whether a value is present or not, leading to confusion and potential `NullPointerException` errors.

## How to fix it

There are a few ways to fix this issue:

- Avoid returning `null` from a method whose return type is `Optional`.
- Remove the null-check of an `Optional` and use `Optional` methods instead, like `isPresent()` or `ifPresent()`.

### Code examples

#### Noncompliant code example

    public void doSomething () {
      Optional<String> optional = getOptional();
      if (optional != null) {  // Noncompliant
        // do something with optional...
      }
      Optional<String> text = null; // Noncompliant, a variable whose type is Optional should never itself be null
      // ...
    }

    @Nullable // Noncompliant
    public Optional<String> getOptional() {
      // ...
      return null;  // Noncompliant
    }

#### Compliant solution

    public void doSomething () {
      Optional<String> optional = getOptional();
      optional.ifPresent(
        // do something with optional...
      );
      Optional<String> text = Optional.empty();
      // ...
    }

    public Optional<String> getOptional() {
      // ...
      return Optional.empty();
    }

## Resources

### Documentation

- Oracle SDK 20 - Optional

### Articles & blog posts

- Java Optional Guide