2014-10-22 15 views
16

vs Kaynakları ile deneyin. Standart try-catch ifadesini daha önce kullandım ve aynı şeyi yapıyor gibi görünüyor. Yani benim sorum Kaynaklar deneyin Try-Catch ile bunlar arasındaki farklar nelerdir ve hangisi daha iyi. İşte kod bakarak edilmiştir ve ben kaynaklarla denemek gördük Try-catch

kaynaklarla denemek geçerli:

objects jar = new objects("brand"); 
objects can= new objects("brand"); 

try (FileOutputStream outStream = new FileOutputStream("people.bin")){ 
    ObjectOutputStream stream = new ObjectOutputStream(outStream); 

    stream.writeObject(jar); 
    stream.writeObject(can); 

    stream.close(); 
    } catch(FileNotFoundException e) { 
     System.out.println("sorry it didn't work out"); 
    } catch(IOException f) { 
     System.out.println("sorry it didn't work out"); 
    } 
+3

fark deneyin-wth-kaynak() stream.close aramaya gerek kalmamasıdır. Sonunda, kapatılan bir yan tümcesi varsa, otomatik olarak çağrılır. Kapatılabilir veya AutoCloseable implmenting Sadece nesneler deneyin-ile-resouce fıkrada kullanılabilir. – sturcotte06

+2

Sen) ('stream.close aramaya gerek (veya muhtemelen olmamalıdır) yoktur; deneyin' 'in {..}' bölüm. Bu deneyin-ile-kaynaklar sizin için idare edecek finally' bölümünde 'yapılmalıdır (BTW deneyin-ile-kaynaklar birden fazla kaynak işleyebilir). – Pshemo

cevap

26

ana nokta, gibi emin olmak için bir hale getirecek Kaynaklar, uygulama kodu gerektirmeden kapalıdır. Yine de düşünülmesi gereken bazı daha ince noktalar var.

Eğer istisna-maskeleme olarak adlandırılan bir potansiyel tuzak deneyin-ile-kaynaklar var kullanmayın. Bir try bloğundaki kod bir istisna atar ve son olarak da yakın metot da bir istisna atar, try bloğu tarafından atılan istisna kaybolur ve nihayetinde atılan istisna nihayet yayılır. Bu genellikle talihsiz bir durumdur, çünkü yakın zamanda atılan istisna, yararsız olanı bilgilendirici olan bir şeydir. Kaynaklarınızı kapatmak için kaynakları kullanmaya çalışmak, herhangi bir istisna maskelemesinin gerçekleşmesini engeller.

deneyin-ile-kaynaklar onlar yakın yönteminden atılan istisnalar dışında ne yapacağına karar zorunda geliştirildi zaman önemli istisna bilgileri, kaybetmek olmaz emin istisna-maskeleme yaparak bir parçası olarak. Ile

deneyin-ile-kaynaklar, try bloğu bir istisna atar ve yakın yöntem, aynı zamanda daha sonra the exception from the close block gets tacked on to the original exception bir istisna, atarsa:

... iki bağımsız istisnalar atılmış olabilir durumlar vardır Kardeş kod blokları, özellikle bir try-with-sources ifadesinin try bloğunda ve kaynağı kapatan derleyicinin oluşturduğu son blokta. Bu durumlarda, atılan istisnalardan yalnızca biri çoğaltılabilir. Kaynaklarla yapılan denemede, bu tür iki özel durum olduğunda, try bloğundan kaynaklanan istisnalar çoğaltılır ve sonuncu bloğun istisnası, try bloğunun istisnası tarafından bastırılan istisnalar listesine eklenir. Bir istisna olarak yığını gevşetir, çoklu bastırılmış istisnalar biriktirebilir.

Öte yandan

kodunuzu normalde tamamlar ancak kullandığınız kaynak kapanırken bir istisna atar, (try bloğundaki kod şey attı eğer bastırılmış olacaktı) bu istisna atılan. Dolayısıyla, bir ResultSet veya PreparedStatement'ın kaynaklarla denenmesiyle kapatıldığı bazı JDBC kodlarınız varsa, bir JDBC nesnesi kapatıldığında bazı altyapı aksaklıklarından kaynaklanan bir istisna atılabilir ve aksi halde başarıyla tamamlanan bir işlemi geri alabilir.

olmadan denemek-kaynaklarla yakın yöntem istisna uygulama kodu kalmıştır atılan olmadığını.Bir atılmış edilirse try bloğu bir istisna, diğer istisna maske olacak nihayet bloktan istisna atar iken nihayet bloke ederler. Ancak geliştirici, atılan ve onu yaymayan istisnayı yakalama seçeneğine sahiptir.

+0

Kullanıcı kodunda diğerleri-bekleyen mantık. – supercat

2

Tek fark, Bir şey cevapsız finally blokta

4

yılında finally blok yapacağı gibi bu deneyin-kaynak otomatik resource.close(); ekleyerek olmasıdır. try-with-resouces bir şey gerçekten (asla kırlangıç ​​istisnalar) gibi bir şey istedi demektir

FileOutputStream outStream = null; 
try { 
    outStream = new FileOutputStream("people.bin"); 
    ObjectOutputStream stream = new ObjectOutputStream(outStream); 

    stream.writeObject(jar); 
    stream.writeObject(can); 

    stream.close(); 
} catch(FileNotFoundException e) { 
    System.out.println("sorry it didn't work out"); 
} catch(IOException f) { 
    System.out.println("sorry it didn't work out"); 
} finally { 
    if (outStream != null) { 
    try { 
     outStream.close(); 
    } catch (Exception e) { 
    } 
    } 
} 

, denemede-ile-kaynakların

try (FileOutputStream outStream = new FileOutputStream("people.bin"); 
    ObjectOutputStream stream = new ObjectOutputStream(outStream);) { 
    stream.writeObject(jar); 
    stream.writeObject(can); 
    // stream.close(); // <-- closed by try-with-resources. 
} catch(FileNotFoundException e) { 
    System.out.println("sorry it didn't work out"); 
    e.printStackTrace(); 
} catch(IOException f) { 
    System.out.println("sorry it didn't work out"); 
    e.printStackTrace(); 
} 
+0

stream.close(); Deneme bloğunda gereksizdir, çünkü akış nihayetinde bloke edilir. – UDPLover

+0

@Meraman ben kaydetti cevabım son bölümünde. OP'nin sorusunun * hayır * 'nihayetinde 'bloğu olduğunu unutmayın. Ben Propagate-temizlik-istisnalar-if-no-aynı tür imkan verecek şekilde kolay araçlar, "dene" den atıldı Ne istisna (eğer varsa) bulmak için "nihayet" bloklar için olsaydı –

0

java.lang.AutoCloseable veya java.io.Closeable 'u uygulayan herhangi bir nesne (sınıf veya bunların üst sınıfı) yalnızca kaynakla birlikte çalışılan yan tümcesinde kullanılabilir. AutoClosable arayüz üst arayüz olup Kapatılabilir arayüzü AutoClosable interface.AutoClosable arayüzü uzanan Kapatılabilir arayüzü IOException atar yöntemi sahipken İstisna atar yakın yöntemi vardır. Ayrıca yakalamak olabilir ve son olarak denemede-ile-kaynak sıradan denemede, av ve son olarak, ancak av gibi takip bloğunda ve deneme-ile-kaynak maddesi içinde bildirilen kaynak kapatıldıktan sonra nihayet sadece idam bloke etmektedir.

İlgili konular