javajava-8

Throw exception in optional in Java8


There is a method get(sql) (I can not modify it). This method returns MyObjects and it has to be in try catch block because JqlParseException is possible there. My code is:

String sql = something;
try{
   MyObject object = get(sql);
} catch(JqlParseException e){
   e.printStackTrace();
} catch(RuntimeException e){
   e.printStackTrace();
}

I want to remove try catch and use Optional class, I tried:

MyObject object = Optional.ofNullable(get(sql)).orElseThrow(RuntimeException::new);

but IDE force there try catch too. And for:

MyObject object = Optional.ofNullable(get(sql)).orElseThrow(JqlParseException::new));

is an error (in IDE) The type JqlParseException does not define JqlParseException() that is applicable. Is there any way to avoid try catch blocks and use optional?


Solution

  • Optional is not intended for the purpose of dealing with exceptions, it was intended to deal with potential nulls without breaking the flow of your program. For example:

     myOptional.map(Integer::parseInt).orElseThrow(() -> new RuntimeException("No data!");
    

    This will automatically skip the map step if the optional was empty and go right to the throw step -- a nice unbroken program flow.

    When you write:

     myOptionalValue.orElseThrow(() -> new RuntimeException("Unavailable"));
    

    ... what you are really saying is: Return my optional value, but throw an exception if it is not available.

    What you seem to want is a way to create an optional (that instantly catches the exception) and will rethrow that exception when you try using the optional.