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

Leu*_*ash 1 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)
Run Code Online (Sandbox Code Playgroud)

此代码段打印"成功".如果我尝试访问myTry.get,那么它会抛出一个NullPointerException.

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

Yuv*_*kov 5

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

具体来说,asJava在a上以Lista的形式创建一个围绕原始集合的包装器SeqWrapper.它不会迭代原始集合:

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

如果您使用其他任何迭代集合或尝试访问它的内容,例如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)
Run Code Online (Sandbox Code Playgroud)