9

除非 try/catch 不起作用我认为它应该起作用的原因,否则我希望捕获以下异常。相反,它只是抛出 NPE。

try {
  scala.io.Source.fromInputStream(null)
} catch {
  case e:Throwable => println("oh cr*p!")
}

相反,以下代码确实有效。

try {
  1/0
} catch {
  case e:Throwable => println("oh cr*p")
}
4

1 回答 1

10

io.Source是惰性的,因此在需要之前不会评估其输入。因此异常不会在初始化时抛出,而是在第一次使用时抛出。这个例子表明:

scala> class Foo(val x: io.Source)
defined class Foo

scala> new Foo(io.Source.fromInputStream(null))
res2: Foo = Foo@1c79f780

这里也不例外。但是,一旦您使用它(在这种情况下将其打印到控制台),它就会引发异常:

scala> res2.x
java.lang.NullPointerException
    at java.io.Reader.<init>(Reader.java:78)
    at java.io.InputStreamReader.<init>(InputStreamReader.java:129)

还有一个小提示:不要捕获 throwable,因为它也会捕获诸如StackOverflowErrorand之类的东西OutOfMemoryError,你不想被捕获。

于 2013-04-26T07:46:32.967 回答