``++Optional++`` value can hold either a value or not. The value held in the ``++Optional++`` can be accessed using the ``++get()++`` method, but it will throw a 

``++NoSuchElementException++`` if there is no value present. To avoid the exception, calling the ``++isPresent()++`` or ``++! isEmpty()++`` method should always be done before any call to ``++get()++``.


Alternatively, note that other methods such as ``++orElse(...)++``, ``++orElseGet(...)++`` or ``++orElseThrow(...)++`` can be used to specify what to do with an empty ``++Optional++``.

== Noncompliant Code Example

[source,java]
----
Optional<String> value = this.getOptionalValue();

// ...

String stringValue = value.get(); // Noncompliant
----

[source,java]
----
if (methodThatReturnsOptional().isEmpty()) {
  throw new NotFoundException();
}
String value = methodThatReturnsOptional().get(); // Noncompliant: indirect access, we consider that two consecutive calls can return different values.
----

== Compliant Solution

[source,java]
----
this.getOptionalValue().ifPresent(stringValue ->
  // Do something with stringValue
);
----

or

[source,java]
----
Optional<String> value = this.getOptionalValue();

// ...

if (value.isPresent()) {
  String stringValue = value.get();
}
----

or

[source,java]
----
Optional<String> value = this.getOptionalValue();

// ...

String stringValue = value.orElse("default");
----

[source,java]
----
Optional<String> optional = methodThatReturnsOptional();
if (optional.isEmpty()) {
  throw new NotFoundException();
}
String value = optional.get();
----

include::../see.adoc[]

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

include::message.adoc[]

'''
== Comments And Links
(visible only on this page)

include::../comments-and-links.adoc[]
endif::env-github,rspecator-view[]
