``++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 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 value = this.getOptionalValue(); // ... if (value.isPresent()) { String stringValue = value.get(); } ---- or [source,java] ---- Optional value = this.getOptionalValue(); // ... String stringValue = value.orElse("default"); ---- [source,java] ---- Optional 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[]