在下面的示例中,最初,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 回答
在这种情况下,它只会返回一个空的可选,当且仅当
this.mMyBoundServiceHandlerThread
是null
因此返回的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
的元素,因此您可能最好重构为:另请注意,
orElse
中提供的替代值与传递给map
方法的替代值相同,这似乎不常见 . 如果你要继续使用Optional,你可能想要研究一下 .它应该是:
s
可能是空Optional
,因此调用s.get()
可能会抛出异常 .如果
Optional
为空,则调用orElse
的目的是提供默认值,但是您对该值没有任何作用 .附:我不确定你的
map
和orElse
调用是否有意义,因为你的map
忽略了Optional
的值 . 您可以使用此等效语句替换整个代码段:我不认为这就是你想要的 .