Gooi uitzondering in Optioneel in Java 8

1. Inleiding

In deze zelfstudie laten we zien hoe u een aangepaste uitzondering genereert wanneer een Optioneel iks leeg.

Als je er dieper op in wilt gaan Optioneel, Bekijk hier onze volledige gids.

2. Optioneel.ofElseThrow

Simpel gezegd, als de waarde aanwezig is, dan is aanwezig() zou terugbrengen waar, en bellen krijgen() retourneert deze waarde. Anders gooit het NoSuchElementException.

Er is ook een methode orElseThrow (leverancier uitzondering leverancier) waarmee we een aangepaste Exception-instantie kunnen bieden. Deze methode retourneert alleen waarde als deze aanwezig is. Anders genereert het een uitzondering die is gemaakt door een opgegeven leverancier.

3. In actie

Stel je voor dat we hebben een methode die een nulbaar resultaat retourneert:

public String findNameById (String id) {return id == null? null: "voorbeeldnaam"; }

Nu gaan we onze bellen findNameById (tekenreeks-id) methode tweemaal en omwikkel het resultaat met een Optioneel door de ofNullable (T-waarde) methode.

Optioneel biedt een statische fabrieksmethode voor het maken van nieuwe instanties. Deze methode wordt genoemd ofNullable (T-waarde). Dan kunnen we bellen orElseThrow.

We kunnen het gedrag verifiëren door deze test uit te voeren:

@Test openbare leegte whenIdIsNull_thenExceptionIsThrown () {assertThrows (InvalidArgumentException.class, () -> Optioneel .ofNullable (personRepository.findNameById (null)) .orElseThrow (InvalidArgumentException :: new)); }

Volgens onze implementatie, findNameById zal terugkeren nul. Dus het nieuwe InvalidArgumentException zal worden gegooid vanaf de orElseThrow methode.

We kunnen deze methode aanroepen met een niet-nulargument. Dan krijgen we geen InvalidArgumentException:

@Test openbare leegte whenIdIsNonNull_thenNoExceptionIsThrown () {assertAll (() -> Optioneel .ofNullable (personRepository.findNameById ("id")) .orElseThrow (RuntimeException :: nieuw)); } 

4. Conclusie

In dit korte artikel hebben we besproken hoe u een uitzondering van Java 8 genereert Optioneel.

Zoals altijd plaatsen we de broncode op onze GitHub.