Kast undtagelse i valgfri i Java 8

1. Introduktion

I denne vejledning skal vi vise, hvordan man kaster en brugerdefineret undtagelse, når en Valgfri jegs tom.

Hvis du vil gå dybere ind i Valgfri, se vores fulde guide her.

2. Valgfri.ellerElseThrow

Kort sagt, hvis værdien er til stede, så er til stede() ville vende tilbage rigtigtog ringer få() returnerer denne værdi. Ellers kaster det NoSuchElementException.

Der er også en metode orElseThrow (leverandørundtagelsesleverandør) der giver os mulighed for at levere en brugerdefineret undtagelsesinstans. Denne metode returnerer kun værdi, hvis den er til stede. Ellers kaster det en undtagelse oprettet af en leveret leverandør.

3. I aktion

Forestil dig det vi har en metode, der returnerer et ugyldigt resultat:

public String findNameById (String id) {return id == null? null: "eksempel-navn"; }

Nu kalder vi vores findNameById (streng-id) metode to gange og pakk resultatet med en Valgfri ved hjælp af ofNullable (T-værdi) metode.

Valgfri giver en statisk fabriksmetode til oprettelse af nye forekomster. Denne metode kaldes ofNullable (T-værdi). Så kan vi ringe eller ElseTrow.

Vi kan kontrollere adfærden ved at køre denne test:

@Test offentlig ugyldig nårIdIsNull_thenExceptionIsThrown () {assertThrows (InvalidArgumentException.class, () -> Valgfri .ofNullable (personRepository.findNameById (null)) .orElseThrow (InvalidArgumentException :: new); }

I henhold til vores implementering, findNameById kommer tilbage nul. Så det nye InvalidArgumentException vil blive kastet fra eller ElseTrow metode.

Vi kan kalde denne metode med et ikke-null-argument. Så får vi ikke en InvalidArgumentException:

@Test offentlig ugyldig nårIdIsNonNull_thenNoExceptionIsThrown () {assertAll (() -> Valgfri .ofNullable (personRepository.findNameById ("id")) .orElseThrow (RuntimeException :: ny)); } 

4. Konklusion

I denne hurtige artikel diskuterede vi, hvordan man smider en undtagelse fra Java 8 Valgfri.

Som altid placerer vi kildekoden på vores GitHub.


$config[zx-auto] not found$config[zx-overlay] not found