在可选方法上获取方法返回No_Value

时间:2018-12-09 11:16:03

标签: android java-8 optional

在下面的示例中,最初,this.mMyBoundServiceHandlerThread为null。我想初始化该对象,如图所示 代码在下面发布。

执行代码时,我收到以下信息:

java.util.NoSuchElementException: No value present

请告诉我为什么.get()返回空值?

代码

Optional<MyBoundServiceHandlerThread> s = Optionals.toOptional(this.mMyBoundServiceHandlerThread);
    s
            .map(x -> new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this))
            .orElse(new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this));
    s.get().start();

2 个答案:

答案 0 :(得分:1)

应该是:

s.map(x -> new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this))
 .orElse(new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this))
 .start();

s可能为空的Optional,因此调用s.get()可能会引发异常。

如果orElse为空,则调用Optional的目的是提供一个默认值,但是您对该值不做任何操作。

P.S。我不确定您的maporElse调用是否合理,因为您的map忽略了Optional的值。您可以使用以下等效语句替换整个代码段:

new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this).start();

我认为那不是你想要的。

答案 1 :(得分:0)

  

请告诉我为什么.get()返回空值?

在这种情况下,仅当this.mMyBoundServiceHandlerThreadnull时,才返回空的Optional,因此返回的Optional处于不存在状态,当对空的Optional调用.get()时,它将返回产生“不存在任何值”,因为可选项处于不存在状态(不存在任何值)。

如果您确定返回的Optional不应该为空,则需要调试和跟踪程序中的mMyBoundServiceHandlerThread标识符。

另一方面,不应该使用Optional代替“ if”语句,这是因为当前,您正在忽略map中标识为x的元素,因此可能会更好重构为:

MyBoundServiceHandlerThread result = null;
if(this.mMyBoundServiceHandlerThread != null) 
    result = new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this)

此外,请注意,orElse中提供的替代值与传递给map方法的替代值相同,这似乎很不正常。如果您要继续使用Optional,则可能需要调查一下。