首页 文章

get方法在可选项上返回No_Value

提问于
浏览
2

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

代码执行时,我收到以下内容:

java.util.NoSuchElementException: No value present

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

code

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 回答

  • 1

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

    在这种情况下,它只会返回一个空的可选,当且仅当 this.mMyBoundServiceHandlerThreadnull 因此返回的Optional有一个缺席状态,当一个空的可选时调用 .get() 它将产生一个"No value present",因为Optional有一个缺席状态(没有值存在) .

    如果您需要在程序中调试和跟踪 mMyBoundServiceHandlerThread 标识符 .

    另请注意,Optional 's should not be used to replace 46584 statements, I am saying this because currently, you'重新忽略 map 中标识为 x 的元素,因此您可能最好重构为:

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

    另请注意, orElse 中提供的替代值与传递给 map 方法的替代值相同,这似乎不常见 . 如果你要继续使用Optional,你可能想要研究一下 .

  • 0

    它应该是:

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

    s 可能是空 Optional ,因此调用 s.get() 可能会抛出异常 .

    如果 Optional 为空,则调用 orElse 的目的是提供默认值,但是您对该值没有任何作用 .

    附:我不确定你的 maporElse 调用是否有意义,因为你的 map 忽略了 Optional 的值 . 您可以使用此等效语句替换整个代码段:

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

    我不认为这就是你想要的 .

相关问题