在下面的示例中,最初,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();
答案 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。我不确定您的map
和orElse
调用是否合理,因为您的map
忽略了Optional
的值。您可以使用以下等效语句替换整个代码段:
new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this).start();
我认为那不是你想要的。
答案 1 :(得分:0)
请告诉我为什么.get()返回空值?
在这种情况下,仅当this.mMyBoundServiceHandlerThread
为null
时,才返回空的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,则可能需要调查一下。