2013-04-26 13 views
9

Jeśli próba/catch nie zadziała, dlaczego myślę, że powinna zadziałać, spodziewam się, że zostanie złapany następujący wyjątek. Zamiast tego po prostu rzuca NPE.scala try/catch nie łapie niektórych wyjątków

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

W przeciwieństwie do tego poniższy kod działa.

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

Odpowiedz

8

To bardzo proste. io.Source jest leniwy, dlatego nie ocenia jego wejścia, dopóki nie jest potrzebny. Dlatego wyjątek nie jest generowany, gdy jest inicjowany, ale gdy jest używany po raz pierwszy. Ten przykład pokazuje, że:

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

scala> new Foo(io.Source.fromInputStream(null)) 
res2: Foo = [email protected] 

Nie ma tu wyjątku. Ale tak szybko, jak go używać (w tym przypadku, aby wydrukować go do konsoli) zgłasza wyjątek:

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

i trochę wskazówka: nie złapać throwables, bo to będzie również złapać rzeczy jak StackOverflowError i OutOfMemoryError, których nie chcesz przechwycić.

+0

dlaczego nie powinniśmy złapać throwables jak StackOverflowError? – Trev

+1

Ponieważ przepełnienie stosu jest zawsze błędem w programie i zamiast leczenia objawu, należy usunąć przyczynę. – drexin

Powiązane problemy