2015-10-27 8 views
6

içinde çalışma zamanı istisnasını atın OCPJP8'deki çalışmalarım sırasında bana çok açık bir cevabı olmayan bir soruyla karşılaştım. Bir soru için kitap doğru cevaba göreClosable.close()

public class Animals 
{ 
class Lamb implements Closeable 
{ 
    public void close() 
    { 
     throw new RuntimeException("a"); 
    } 
} 

public static void main(String[] args) 
{ 
    new Animals().run(); 
} 

public void run() 
{ 
    try (Lamb l = new Lamb();) 
    { 
     throw new IOException(); 
    } 
    catch (Exception e) 
    { 
     throw new RuntimeException("c"); 
    } 
} 
} 

: Aşağıdaki kodu düşünün "Hangi istisna olacak kod atmada?" "bastırılma özel durum hariç çalışma zamanı istisnası" dir. Bu kodu Eclipse ve system.out içinde kontrol ettim, kitabın doğru olduğunu öneriyorum. Ancak, ben de kod biraz değiştirilmiş ve sadece RuntimeException "c"

System.out.println(e.getSuppressed().toString()); 

ve ben bu System.out gelen var çıkışını atmadan önce aşağıdaki System.out ekledik geçerli:

[Ljava.lang.Throwable; 75da931b

@ Yani açıkça bir bastırılmış istisna vardır. Hata ayıklama modunda, bu bastırılmış özel durumun close() yönteminde kaşındığını buldum.

İki soru: 1. Neden konsolda close() yöntemine eklenen istisna hakkında bilgi yok? 2. Kitap tarafından verilen cevap doğru mu?

+0

Bir yan not olarak, daha anlamlı bir çıktı almak için 'System.out.println (Arrays.toString (e.getSuppressed())); – Holger

cevap

3

bastırılmış durum (RuntimeException -A) catch yakalanmış ve RuntimeException -C cause olarak geçmemiş gibi yığın izleme çıktısından kayıp IOException ilave edildi. RuntimeException -C main den basıldığında

Yani IOException veya bastırılmış RuntimeException -A hiç söz vardır.

Ve main yönteminden yayılır Tek istisna RuntimeException çünkü -C cause (IOException) olmadan ve herhangi bastırılmış istisnasız (o IOException oldu gibi) bu nedenle kitabın yanıt doğrudur.