try example catch java if-statement nullpointerexception

java - example - try..catch VS long if()



throw exception java (1)

Si puede refactorizar el código y hacer que cada método devuelva Optional . Será posible evitar las comprobaciones nulas e intentar ... atrapar.

Optional<Result> result = something.getSomethingElse() .flatMap(e -> e.getSecondSomething()) .flatMap(x -> x.getThirdSomething()) .flatMap(e -> e.getFourthSomething()); // at the end to check if result is present result.ifPresent(..some_logic_here..); // or result.orElse(...);

entonces getSomethingElse() devuelve Optional<SomethingElse> , getThirdSomething() - Optional<ThirdSomething> y así sucesivamente. Tenemos que usar aquí flatMap(Function<? super T,Optional<U>> mapper) porque si el asignador proporcionado es uno cuyo resultado ya es un opcional, y si se invoca, flatMap no lo envuelve con un opcional adicional. En otras palabras, si el map en el map(e -> e.getSecondSomething()) el tipo de resultado será Optional<Optional<SecondSomething>> y tendremos que hacer innecesario get() call - map(...).get().map(...) .

Espero que esto ayude.

ACTUALIZADO Puedes hacer lo mismo usando referencias de métodos.

Optional<Result> result = something.getSomethongElse() .flatMap(SomethongElse::getSecondSomething) .flatMap(SecondSomething::getThirdSomething) .flatMap(ThirdSomething::getFourthSomething);

Esta pregunta ya tiene una respuesta aquí:

Tengo una estructura de modelo compleja en mi proyecto.
A veces tengo que sacarle un valor profundo . Parece que sigue:

something.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething();

El problema es que cada uno de esos métodos podría devolver null , y obtendré NullPointerException en caso de que así sea.

Lo que quiero saber es si escribo mucho si me gusta

if(something != null && something.getSomethongElse() != null && something..getSomethongElse().getSecondSomething() != null && something.getSomethongElse().getSecondSomething().getThirdSomething() != null && omething.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething() != null) { //process getFourthSomething result. }

O está bien solo usar try..catch como sigue:

SomethingFourth fourth = null; try { fourth = something.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething(); } catch (NullPointerException e) { } if(fourth != null) { ///work with fourth }

Sé que NPE es algo que debe evitarse, pero ¿no es excesivo evitarlo en mi caso?