除非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")
}
答案 0 :(得分: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)
还有一点提示:不要抓住扔掉的东西,因为那样也会抓住StackOverflowError
和OutOfMemoryError
这样的东西,你不想被抓住。