Scala 检查选项[Long]中的空值

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.

我是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.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
不匹配的内容,包括
部分(空)
null

null。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)
  }

}