2011-05-23 18 views

cevap

23

Evet, bunu yapabilirsiniz.

InputStream in = /* ... */; 
try { 
} catch (...) { 
} finally { 
    try { 
     in.close(); 
    } catch (...) { 
    } finally { 
    } 
} 

Bunun için kötü bir uygulama

+0

+1 için iyi bir örnek – Alp

+0

İyi örnek. Ancak bunu her zaman çok okunabilir kod olarak kabul ediyorum ve boş çek ile Kapanabilir örnekleri kapatabilecek bazı kullanım yöntemi veya sınıf oluşturmaya çalışıyorum. –

1

Çirkin görünüyor ama bazen gitmenin yolu. Koduna bağlı olarak, ikinci try-catch-finally bloğu ile bir yöntem çıkarmayı düşünün.

1

Mümkün olduğunda bunu önlemek en iyisidir, ancak bazen gerekli olabilir. Bize neden ihtiyacınız olduğunu düşündüğünüz hakkında daha fazla bilgi verirseniz, daha iyi yanıtlar verebiliriz :-)

Taahhüd işleminin kendisinde olabileceği düşünülmesinin nedenlerinden biri, finally satırında bir işlem yapmak olabilir. bir istisna atmak.

Son olarak bir bloğun içine atılan istisnaların, düzgün şekilde ele alınmadıkça, daha önce atılan istisnalar için try bloğu içinde kolayca gölgelenebileceğini unutmayın. Böylece, bu tür yuvalanmış deneme/yakalama blokları bazen gitmek için yoldur. Ancak, diğerlerinin de hatırlayabildiği gibi, okunabilirliği arttırmak için, finally bloğunun iç kısımlarının ayrı bir yönteme çıkarılması tavsiye edilir.

7

olurdu her türlü durumu görmüyorum:

Aslında, hatta düzgün kapatmak istiyor akışları ile uğraşırken bunu yapmak için gerekli olan okunabilirliği sen gibi ayrı bir yönteme de iç içe try-catch çarpanlarına olabilir:

try{ 
    }catch(){} 
    finally{ 
    cleanup(); 
    } 

Ve ikinci try-catch temizleme yöntemi içinde olabilir.

IO paketinde yukarıdaki kalıbı desteklemek için java6 aşağıdaki gibi tek bir temizleme yöntemi olabilir, böylece tüm akarsular, uygulamak olduğunu Kapatılabilir denilen yeni bir sınıf tanıttı: Bu çirkin

public static boolean cleanup(Closeable stream) 
{ 
try{ 
    stream.close(); 
    return true; 
    }catch(){ 
    return false; 
    } 
} 
1

ama orada Bu durumdan kaçınamayacağınız durumlar, özellikle kaynaklarda temiz kaynaklara sahip olduğunuz ve tek bir kaynağın temizlenebileceği bir istisna oluşturabilir.

Tipik bir örnek, JDBC kodundaki ResultSet, Statement ve Connection nesnelerini topluyor. ResultSet'in kapatılması bir istisna oluşturabilir, ancak yine de devam etmek ve Bildirim ve Bağlantıyı kapatmak istiyoruz.

İlgili konular