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)

ちょっとしたヒント: スロー可能オブジェクトをキャッチしないでください。これは、キャッチされたくないStackOverflowErrorや などもキャッチするためです。OutOfMemoryError

于 2013-04-26T07:46:32.967 に答える