Scala尝试 - 这不应该导致失败吗?

时间:2016-08-28 06:05:46

标签: scala try-catch

import scala.collection.JavaConverters._

val line: List[String] = null
val myTry = Try(line.asJava)

val result = myTry match {
  case Success(_) => "Success"
  case Failure(_) => "Failure"
}

println(result)

此代码段打印"成功"。如果我尝试访问myTry.get,则会抛出NullPointerException

根据我的理解尝试,不应该尝试失败吗?

1 个答案:

答案 0 :(得分:5)

  

从我的理解尝试,不应该myTry成为失败?

具体而言,asJava上的ListSeqWrapper的形式围绕原始集合创建了一个包装器。它不会迭代原始集合:

case class SeqWrapper[A](underlying: Seq[A]) extends ju.AbstractList[A] with IterableWrapperTrait[A] {
    def get(i: Int) = underlying(i)
}

如果您使用其他任何迭代集合或尝试访问集合的内容,例如toSeq,您将看到失败:

import scala.collection.JavaConverters._

val line: List[String] = null
val myTry = Try(line.toSeq)

val result = myTry match {
  case Success(_) => "Success"
  case Failure(_) => "Failure"
}

println(result)