Bazı yeni kodları inceliyorum. Programın yalnızca bir try ve final bloğu vardır. Catch bloğu hariç tutulduğundan, try bloğu bir istisna veya atılabilir herhangi bir şeyle karşılaşırsa nasıl çalışır? Doğrudan en sonunda bloğa mı gidiyor?
Bazı yeni kodları inceliyorum. Programın yalnızca bir try ve final bloğu vardır. Catch bloğu hariç tutulduğundan, try bloğu bir istisna veya atılabilir herhangi bir şeyle karşılaşırsa nasıl çalışır? Doğrudan en sonunda bloğa mı gidiyor?
Yanıtlar:
Try bloğundaki kodlardan herhangi biri kontrol edilmiş bir istisna atabilirse, bu, yöntem imzasının throws cümlesinde görünmesi gerekir. Denetlenmemiş bir istisna atılırsa, yöntemden dışarı çıkar.
Nihai blok, bir istisna atılsa da atılmasa da her zaman yürütülür.
try
/ Hakkında küçük bir not finally
: Son, her zaman
System.exit()
denir.try{}
Blok asla uçları (örn sonsuz döngü).try{..} catch{ throw ..} finally{..}
? Sanırım sonunda idam edilmeyecek
Java Dil Spesifikasyonu (1) nasıl try-catch-finally
yürütüleceğini açıklar . Yakalanmamak, verilen Fırlatılabilir'i yakalayamamakla eşdeğerdir.
- Try bloğunun yürütülmesi, bir V değerinin atılması nedeniyle aniden tamamlanırsa, bir seçim vardır:
- V'nin çalışma zamanı türü, try ifadesinin herhangi bir catch cümlesinin parametresine atanabilirse, o zaman
……- V'nin çalışma zamanı türü try deyiminin herhangi bir catch cümlesinin parametresine atanamazsa, o zaman final bloğu çalıştırılır . O zaman bir seçim var:
- Nihayet bloğu normal şekilde tamamlanırsa, try ifadesi V değerinin atılması nedeniyle aniden tamamlanır.
- Nihai blok S nedeni ile aniden tamamlanırsa, o zaman try ifadesi S nedeni ile aniden tamamlanır (ve V değerinin atılması atılır ve unutulur).
İç son olarak, istisnayı dış bloğa atmadan önce yürütülür.
public class TryCatchFinally {
public static void main(String[] args) throws Exception {
try{
System.out.println('A');
try{
System.out.println('B');
throw new Exception("threw exception in B");
}
finally
{
System.out.println('X');
}
//any code here in the first try block
//is unreachable if an exception occurs in the second try block
}
catch(Exception e)
{
System.out.println('Y');
}
finally
{
System.out.println('Z');
}
}
}
Sonuçlar
A
B
X
Y
Z
Nihai blok, try bloğu bittikten sonra her zaman çalıştırılır, try normal veya normal bir istisna nedeniyle, er, atılabilir.
Try bloğundaki herhangi bir kod tarafından bir istisna atılırsa, o zaman geçerli yöntem aynı istisnayı yeniden atar (veya atmaya devam eder) (final bloğunu çalıştırdıktan sonra).
Nihai blok bir istisna / hata / atılabilirlik atarsa ve zaten bekleyen bir atılabilir durum varsa, çirkinleşir. Açıkçası, tam olarak ne olduğunu unutuyorum (yıllar önce sertifikam için çok fazla). Ben düşünüyorum hem throwables birbirine bağlanmış olsun, ama yapmanız gereken bazı özel voodoo var (yani - Ben bakmak zorunda kalacak bir yöntem çağrısı) "nihayet" kustum, er, kustu önce orijinal sorunu olsun.
Bu arada, deneyin / nihayet kaynak yönetimi için oldukça yaygın bir şeydir, çünkü java'da yıkıcılar yoktur.
Örneğin -
r = new LeakyThing();
try { useResource( r); }
finally { r.release(); } // close, destroy, etc
"Sonunda", bir ipucu daha: eğer do bir catch koymak için zahmet, ya yakalama spesifik (beklenen) throwable alt sınıfları, ya da sadece yakalamak "Throwable", değil genel catch-all hata tuzak "İstisna",. Yansıma saçmalıkları gibi çok fazla sorun, "İstisnalar" yerine "Hatalar" atar ve bunlar şu şekilde kodlanmış herhangi bir "tümünü yakala" tarafından kayar:
catch ( Exception e) ... // doesn't really catch *all*, eh?
bunun yerine şunu yapın:
catch ( Throwable t) ...
Sürüm 7'den önceki Java sürümleri, bu üç deneme-yakalama kombinasyonuna izin verir ...
try - catch
try - catch - finally
try - finally
finally
try
veya / ve catch
blokta ne olduğuna bakılmaksızın blok her zaman yürütülecektir . yani catch
blok yoksa, istisna burada ele alınmayacaktır.
Ancak, uygulamanızın elbette tamamen çökmesini istemediğiniz sürece, kodunuzun herhangi bir yerinde bir istisna işleyicisine ihtiyacınız olacak. Bu işleyicinin tam olarak nerede olduğuna uygulamanızın mimarisine bağlıdır.
- Java try bloğunun ardından catch veya last block gelmelidir.
- Her try bloğu için, sıfır veya daha fazla catch bloğu olabilir, ancak yalnızca bir nihai blok olabilir.
- Program çıkarsa (System.exit () çağırarak veya işlemin durmasına neden olan ölümcül bir hataya neden olarak) sonuncu blok çalıştırılmayacaktır.
try bloğu, bir istisna veya atılabilecek herhangi bir şeyle karşılaşırsa nasıl çalışır?
İstisna, yakalanmadığı diğer durumlarda olduğu gibi bloktan atılır.
Nihayet bloğu, try bloğundan nasıl çıkıldığına bakılmaksızın yürütülür - herhangi bir yakalama olup olmadığına bakılmaksızın, eşleşen bir yakalama olup olmadığına bakılmaksızın.
Yakalama blokları ve nihayet, try bloğunun ortogonal parçalarıdır. İkisinden birine veya ikisine birden sahip olabilirsiniz. Java 7 ile ikisine de sahip olamayacaksınız!
O programla denemiyor musun? Sonunda nihayet bloğu engelleyecek ve yürütecek, ancak istisna ele alınmayacak. Ancak, bu istisna, nihayet blokta reddedilebilir!
İç try
bloğa bir istisna atabilecek kodlar yazıyoruz. catch
İstisnayı işlemeyi nerede bloktur. finally
Blok olursa olsun her zaman istisna olsun veya olmasın, yürütülür.
Şimdi, dene-yakala-nihayet bloğu yerine dene-nihayet bloğumuz varsa, o zaman istisna ele alınmayacak ve bloğu yakalamak yerine kontrol bloğundan sonra blok nihayet bloğa gidecek. İstisna ile hiçbir şey yapmak istemediğimizde try-final bloğunu kullanabiliriz.