Scala 检查选项[Long]中的空值
我是Scala的新开发人员,我想写一个简单的函数:Scala 检查选项[Long]中的空值,scala,Scala,我是Scala的新开发人员,我想写一个简单的函数: def compute_start(start: Option[Long]) : (Int, Int, Int) = { if (start != null.asInstanceOf[Long] && start != null && start != "null") { // I tried ALL THOSE OPTIONS !!! var result = helper(start.
def compute_start(start: Option[Long]) : (Int, Int, Int) = {
if (start != null.asInstanceOf[Long] && start != null && start != "null") { // I tried ALL THOSE OPTIONS !!!
var result = helper(start.get) // another function
(temp._1, temp._2, temp._3)
} else {
(0, 0, 0)
}
但我总是犯这样的错误:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 696.0 failed 8 times, most recent failure: Lost task 0.7 in stage 696.0 (TID 99422, ldatanode10ch.nms.ld, executor 145): java.util.NoSuchElementException: None.get
因此,我猜条件if(start!=null.asInstanceOf[Long]没有返回true
请问,如何避免长(或选项[long])变量的空值??
谢谢!您可以像这样使用模式匹配:
def compute_start(开始:选项[Long]):(Int,Int,Int)={
开始比赛{
案例部分(值)=>
val结果=辅助对象(值)
(结果1,结果2,结果3)
案例无=>(0,0,0)
}
}
编辑:再仔细考虑一下您的问题,我相信您的
start
值被传递为null
,这是一些奇怪的Java库将此值传递给函数的副作用。处理此问题的一种方法是确保有如下可选值:
//从库中获取的模拟值(可能必须)
val start:选项[Long]=null
//确保起始值是安全的(无空值)
val safeStart=Option(start).filter(u.nonEmpty).flatten
//现在你应该得到一个安全的结果
val结果=计算开始(开始)
您可以在start
上进行模式匹配,以安全地测试start
是否有值,并将其提取到变量(long
)中,然后使用与if语句相同的方法
def compute_start(start: Option[Long]) : (Int, Int, Int) = start match {
case Some(long) => {
var result = helper(long) // another function
(temp._1, temp._2, temp._3)
}
case None => (0,0,0)
}
将
null
(选项(x)
),然后将其展开(.flatte
),然后作为标准的选项[Long]
继续操作
def compute_start(start: Option[Long]) : (Int, Int, Int) =
Option(start).flatten.fold((0, 0, 0)){ startVal =>
val result = helper(startVal) // don't use var's
(temp._1, temp._2, temp._3)
}
您的错误是
NoTouchElementException
,而不是NullPointerException
。尤其是错误消息
java.util.NoSuchElementException: None.get
表示您正在对调用get
,可能在此行(但您应该从堆栈跟踪中看到):
当然,如果start
是None
,那么它就不等于0L
(0.asInstanceOf[Long]
)、null
,或者“null”
,因此您的检查都不起作用
所以要解决这个问题,你应该像其他答案所说的那样进行模式匹配。如果在这种情况下,你得到了NullPointerException
,但它仍然来自这个地方,我猜start
是Some(null)
。你可以像这样处理它
def compute_start(start: Option[Long]) : (Int, Int, Int) = {
start match {
case Some(value) if value != null =>
val result = helper(value)
(result._1, result._2, result._3)
case _ => (0,0,0)
}
}
Case
\uuu
包含任何与先前的Case
不匹配的内容,包括部分(空)
和nullnull。asInstanceOf[Long]
始终为0,因此如果开始!=0,则该条件永远不会成立。另请参见:它仍然不起作用…我仍然得到NullPointerException。您可以在您的答案上添加堆栈跟踪,以便我们可以帮您找到吗?如果开始为null
,则将给出匹配错误而不是NullPointerException
。Some(null)
更有可能。它仍然不起作用…我仍然得到NullPointerExceptionnull.fold将生成异常non?我认为我们不能对null值使用fold!它仍然不起作用…我仍然得到NullPointerException您的输入是什么?
def compute_start(start: Option[Long]) : (Int, Int, Int) = {
start match {
case Some(value) if value != null =>
val result = helper(value)
(result._1, result._2, result._3)
case _ => (0,0,0)
}
}