Sonunda bir blok her zaman Java'da yürütülür mü?
Bu kodu göz önünde bulundurursak , ne olursa olsun , bloğun her zaman çalıştığından kesinlikle emin olabilir miyim ? finally something()
jonny five2008-09-152008-09-15 17:43:54Z
Evet, ya da kod bloklarının finally yürütülmesinden sonra aranacaktır. try catch
Sadece zamanlar finally aranmaz:
Eğer çağırdıysan System.exit()
JVM önce kilitlenirse
JVM, try veya catch bloğunda sonsuz bir döngüye (veya başka bir kesintiye uğramaz, sonlandırıcı olmayan bir ifadeye) ulaşırsa
İşletim sistemi zorla JVM işlemini sonlandırırsa; örneğin, kill -9 <pid> UNIX’de
Ana sistem ölürse; örneğin, elektrik kesintisi, donanım hatası, işletim sistemi panik, vb.
Eğer finally blok bir daemon thread tarafından çalıştırılacaksa ve diğer tüm daemon-thread konuları çıkıştan önce finally çağrılır.
Ayrıca, her ne kadar kötü bir uygulama olsa da, nihayet bloğun içinde bir return ifadesi varsa, normal bloğun diğer herhangi bir getirisini atar. Başka bir deyişle, aşağıdaki satır yanlış döndürür:
Son bloktaki istisnaları atmakla aynı şey.
İşte Java Dil Belirtimi'nden resmi kelimeler.
14.20.2. Try-finally ve try-catch-finally'ın yürütülmesi
Bir try bir ile deyim finally bloğu ilk yürüterek yürütülür try bloğu. O zaman bir seçim var:
try Bloğun yürütülmesi normal olarak tamamlanırsa, [...]
try Bloğun yürütülmesi V throw değerindeki a nedeniyle aniden tamamlanırsa , [...]
try Bloğun yürütülmesi, başka herhangi bir nedenden R aniden tamamlanırsa , finally blok yürütülür. O zaman bir seçim var:
Son blok normal olarak tamamlanırsa, try ifade R nedeni için aniden tamamlanır .
Eğer finally blok nedenle aniden tamamlar S , daha sonra try aniden sebeple deyimi tamamlamalar S ( ve neden R atılır ).
İçin şartname return aslında bu açık yapar:
JLS 14.17 İade Beyanı
Kontrolü, onu içeren metodun veya kurucunun başkana devretme girişiminde bulunmayan bir return ifade . Expression
Bir return bir deyimiyle Expression girişimi onu içeren yöntemin invoker kontrolü aktarmak üzere, değerinin Expression değeri, yöntem çağrısının değeri olur.
Yukarıdaki açıklamalar "demek girişimleri aktarımı kontrolüne sadece" yerine " transfer kontrol eğer varsa, çünkü" try yöntemi veya olan yapıcı içindeki ifadeler try blokları içeren return açıklama, daha sonra herhangi bir finally olanların maddeleri try tabloların en dıştaki içteki, sırayla çalıştırılır , kontrolün metodun ya da yapıcının çağrıcısına aktarılmasından önce. Bir finally cümlenin aniden tamamlanması, bir return ifadenin başlattığı kontrolün transferini bozabilir .
Diğer yanıtlara ek olarak, 'sonunda' herhangi bir istisna / döndürülen değeri try..catch bloğuyla geçersiz kılma hakkına sahip olduğunu belirtmek önemlidir. Örneğin, aşağıdaki kod 12 döndürür:
Benzer şekilde, aşağıdaki yöntem bir istisna atmaz:
Aşağıdaki yöntem onu ​​atıyor olsa da:
Eyal Schneider2010-05-132010-05-13 07:11:59Z
Yukarıdaki örneği hafif bir değişiklikle denedim.
Yukarıdaki kod çıktıları:
Sonunda geri dönüş kozları.
Bunun nedeni return i; , yürütmenin ne zaman i 2 değerine sahip olduğudur. Bundan sonra, finally blok, 12'nin atandığı i ve sonra yürütüldüğü yerde System.out yürütülür.
finally Bloğu yürüttükten sonra blok, try 12 döndürmek yerine 2 döndürür, çünkü bu return cümlesi tekrar çalıştırılmaz.
Bu kodu Eclipse'de hata ayıklayacaksanız System.out , finally blok çalıştırıldıktan sonra blok return ifadesinin try tekrar yürütüldüğünü hissedeceksiniz . Ancak bu durum böyle değil. Sadece 2 değerini döndürür.
İşte Kevin'in cevabının bir detaylandırması . Döndürülecek ifadenin finally , daha sonra döndürülse bile daha önce değerlendirildiğini bilmek önemlidir .
Sonunda bir blok tüm fikri budur. Elbette, diğer şeylerin yanı sıra geri döndüğünüz için, atlanabilecek temizleme işlemleri yaptığınızdan emin olmanızı sağlar.
Sonunda try bloğunda ne olduğuna bakılmaksızın çağrılır ( siz veya Java Sanal Makinesi başka bir nedenden ötürü çıkmazsa System.exit(int) ).
Chris Cooper2010-05-132010-05-13 06:19:17Z
Bunu düşünmenin mantıklı bir yolu:
Bir son bloğuna yerleştirilen kod , try bloğunda ne olursa olsun gerçekleştirilmelidir.
Bu nedenle, try bloğundaki kod bir değer döndürmeye veya bir istisna atmaya çalışırsa, son blok çalışana kadar öğe 'rafa' yerleştirilir
Son bloktaki kod (tanım gereği) yüksek önceliğe sahip olduğundan, ne isterse geri döndürebilir veya atabilir. Bu durumda 'rafta' kalan her şey atılır.
Bunun tek istisnası, VM'nin deneme bloğu sırasında örneğin 'System.exit' tarafından tamamen kapanmasıdır.
Garth Gilmour2008-09-152008-09-15 19:26:44Z
Sonunda anormal bir program sonlandırma olmadıkça (System.exit (0) .. çağırıyor gibi) yürütülür. yani, sysout'unuz yazdırılacak
Ayrıca nihayet bir geri dönüş, herhangi bir istisnayı ortadan kaldıracaktır. http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html
James A. N. Stauffer2008-09-152008-09-15 19:26:15Z
Son blok, bir JVM kilitlenmesinden veya bir çağrıdan kaynaklanacak normal olmayan bir program sonlandırma olmadıkça her zaman gerçekleştirilir System.exit(0) .
Bunun üzerine, nihayet bloğun içinden döndürülen herhangi bir değer, nihayet bloğun yürütülmesinden önce döndürülen değeri geçersiz kılar, bu nedenle nihayet try'u kullanırken tüm çıkış noktalarını kontrol etmeye dikkat edin.
Hayır, her zaman bir istisna olayı olmaz // System.exit (0); nihayet bloktan önce nihayet yürütülmesini engeller.
Rajendra Jadi2013-07-132013-07-13 23:02:23Z
Sonunda her zaman tam mesele budur, sadece dönüşün ardından kodda göründüğü için, bunun nasıl uygulandığı anlamına gelmez. Java çalışma zamanı, try bloktan çıkarken bu kodu çalıştırma sorumluluğuna sahiptir .
Örneğin, aşağıdakilere sahipseniz:
Çalışma zamanı şöyle bir şey üretecektir:
Yakalanmamış bir istisna atılırsa finally blok çalışır ve istisna yayılmaya devam eder.
Bunun nedeni, i değerini 12 olarak atadınız, ancak i değerini işleve döndürmediniz. Doğru kod aşağıdaki gibidir:
Çünkü siz System.exit() (veya iş parçacığı çöktüğünde) aramadıkça bir son blok her zaman çağrılır .
Jay Riggs2010-05-132010-05-13 06:19:17Z
Cevap basit, EVET .
Evet çağrılacak. Sonunda bir anahtar kelimeye sahip olmanın asıl amacı budur. Eğer try / catch bloğundan atlamak, nihayet bloktan atlayabiliyorsa, System.out.println'yi try / catch'in dışına koymakla aynıydı.
Kısaca, resmi Java Dokümantasyonunda ( Buraya tıklayın ) yazılmıştır -
JVM, try veya catch kodu yürütülürken çıkarsa, son blok çalıştırılmayabilir. Benzer şekilde, try veya catch kodunu yürüten iş parçacığı kesintiye uğradığında veya öldürülürse, uygulama bir bütün olarak devam etse de, sonuçta blok işleyemeyebilir.
Evet, nihayet blok her zaman yürütülür. Geliştiricinin çoğu bu bloğu, veri tabanı bağlantısını, resultset nesnesini, ifade nesnesini kapatarak kullanır ve ayrıca işlemi geri almak için java hazırda bekletme modunda kullanır.
Gautam Viradiya2014-12-022014-12-02 12:30:14Z
Evet, olacak. Aksi takdirde, System.exit () denen veya JVM kilitlenmediği sürece, deneyin veya catch bloğunuzda ne olursa olsun. Bloklarda herhangi bir return ifadesi varsa, nihayet bu return ifadesinden önce yürütülecektir.
Evet olacak. JVM'nin çıkması veya çökmesi yaşanmaması gereken tek durum
@ Vibhash'ın cevabına başka bir cevabın eklenmesi, aşağıdakine benzer bir değişken nesnede ne olduğunu açıklar.
Pradeep Kumaresan2018-04-102018-04-10 11:33:34Z
Aşağıdaki programı göz önünde bulundurun:
Java 1.8.162'den itibaren, yukarıdaki kod bloğu aşağıdaki çıktıyı verir:
Bu, finally nesneleri serbest bırakmanın aşağıdaki kod gibi iyi bir uygulama olduğu anlamına gelir :
Bu aslında herhangi bir dilde doğrudur ... sonunda, geri dönüşün yöntem gövdesinde nerede olduğu fark etmeksizin, her zaman bir return ifadesinden önce yürütülür. Durum böyle olmasaydı, nihayet bloğun pek bir anlamı olmazdı.
Scott Dorman2008-09-152008-09-15 18:03:05Z
Son olarak, try bloğundaki bir dönüşün yerine geri dönüşle ilgili noktaya ek olarak, aynısı bir istisna için de geçerlidir. Bir istisna atan bir blok, try bloğu içinden atılan bir geri dönüş veya istisnayı değiştirir.
Alex Miller2008-10-012008-10-01 15:15:44Z
finally yürütecek ve bu kesin.
finally aşağıdaki durumlarda yürütülmeyecektir:
dava 1 :
İdam ederken System.exit() .
JVM / Thread'iniz çöktüğünde.
Uygulamanız arasında manuel olarak durdurulduğunda.
Utkash Bhatt2014-12-182014-12-18 06:36:56Z
HER ZAMAN DEĞİL
Java Dili özelliği, try-catch-finally ve try-catch bloklarının 14.20.2'de nasıl çalıştığını açıklar
. Hiçbir yerde, nihayet bloğun her zaman yürütüldüğünü belirtir. Ancak, try-catch-finally ve try-finally bloklarının tamamlandığı tüm durumlar için, tamamlamadan önce nihayet yürütülmesi gerektiğini belirtir.
JLS garanti etmez FIN sonra yürütülür KODU . Eğer JLS garanti KOD ve SONRAKİ sonra yürütülür FIN daima sonra infaz edilecek KODU ve önce İLERİ .
JLS neden nihayet bloğun her zaman try bloğundan sonra yürütüleceğini garanti etmiyor? Çünkü imkansız. JVM'nin, try bloğunu tamamladıktan hemen sonra ancak nihayet bloğun çalıştırılmasından önce durdurulması muhtemeldir, ancak bu mümkün değildir. JLS'nin bunu önlemek için yapabileceği hiçbir şey yok.
Bu nedenle, uygun davranışları için her zaman, blokları tamamlandıktan sonra yürütülen bloklara bağlı olan herhangi bir yazılım tıkanır.
Deneme bloğundaki döndürmeler bu sorunla ilgili değildir. Uygulama, try-catch-nihayetinden sonra koda ulaşırsa, nihayet bloğun try bloğu içinde, iadeli veya iadeli olmadan gerçekleştirilmiş olması garanti edilir.
Jose Antonio Dura Olmos2015-12-122015-12-12 14:30:53Z
Sonunda Block her zaman idam edilir. Tabi ve orada System.exit () ifadesi var olmadığı sürece ( nihayet bloktaki ilk ifade).
Eğer System.exit () sonra nihayet blok nihayet bloğun çıkıp idam ve kontrol almazsınız ilk ifadedir. Ne zaman System.exit () deyimi sonunda bu ifade nihayet blok çalıştırılana kadar nihayet bloğa girdiğinde ve System.exit () göründüğünde kontrol kuvveti tamamen sonunda bloktan dışarı çıkar.
Avinash Pande2017-05-202017-05-20 12:16:09Z
İstisna işlemezseniz, programı sonlandırmadan önce JVM sonunda blok uygular. Yalnızca normal programın yürütülmesi, aşağıdaki nedenlerden dolayı programın sona ermesi halinde başarısız olur.
İşlemin iptal edilmesine neden olan önemli bir hataya neden olarak.
Hafızanın bozulması nedeniyle programın sonlandırılması.
System.exit () adlı kişiyi arayarak
Program sonsuz döngüye girerse.
Vikas Suryawanshi2017-06-082017-06-08 12:41:40Z
Java kelimesinde neden “final” anahtar sözcüğünü kullanmalıyım?
Java'da ana bilgisayar adı almanın önerilen yolu
Java'da “unixtime” almak
Java 8'de 2 oklu lambda ne anlama geliyor?
Sonunda bir blok her zaman çalışır mı?
Tek bir ifadeyle java'da yürütülen birden çok sorgu
Java’daki adlandırma kuralı ne anlama geliyor?
C# “Nihayet” bloğu HER ZAMAN yürütüyor mu? [çift]
[B sınıfı sınıfı Java’da neyi temsil ediyor?
Objective-C'de bir dizginin boş olup olmadığını nasıl test ederim?
Toplu iş dosyasındaki bir yeni satırı nasıl ekleyebilirim?
size_t işaretsiz int
HTML’yi .NET’te PDF’ye dönüştürün
OpenSSL kullanarak “rastgele durum” yazamamak ne demektir?
Java'da sabitleri uygulamanın en iyi yolu nedir? [kapalı]
Node.js 'fs.readFile () neden dize yerine bir arabellek döndürüyor?
İki farklı dizinde bulunan farklı dosyalar