Yeni bir İstisna atsanız bile son olarak bir blok çalışır mı?


142

Bu kodda someVarcatch bloğu yürütülmüş ve ikinci İstisna atılmış olsa bile ayarlanır?

public void someFunction() throws Exception {
    try {
        //CODE HERE
    } catch (Exception e) {
        Log.e(TAG, "", e);
        throw new Exception(e);
    } finally {
        this.someVar= true;
    }
}

2
Çünkü @GaryF
jax

1
Nihai bloğun bir istisna atarsa ​​veya bir dönüş yaparsa beklendiği gibi yürütülemeyebileceğini belirtmek gerekir.
Peter Lawrey

Yanıtlar:


184

Evet, sonunda bloklar her zaman çalışır ...

  • Try-catch-nihayet bloğunu çalıştıran iş parçacığı öldü veya kesildi
  • Kullan System.exit(0);
  • Temel VM başka bir şekilde yok edildi
  • Temel donanım bir şekilde kullanılamaz

Ayrıca, nihayet bloğunuzdaki bir yöntem yakalanmamış bir istisna atarsa, bundan sonra hiçbir şey yürütülmez (yani istisna, diğer kodlarda olduğu gibi atılır). Bunun olduğu çok yaygın bir durum java.sql.Connection.close().

Bir yana, kullandığınız kod örneğinin sadece bir örnek olduğunu tahmin ediyorum, ama sonunda mantık yerine gerçek mantık koymaya dikkat edin. Son olarak blok, kaynak temizleme mantığı için değil, kaynak temizleme (DB bağlantılarını kapatma, dosya tanıtıcılarını serbest bırakma vb.) İçin tasarlanmıştır. Çalıştırılması gerekiyorsa, try-catch bloğundan önce, istisna atabilecek bir şeyden uzakta yapın, çünkü niyetiniz neredeyse kesinlikle işlevsel olarak aynıdır.


4
Burada "try-catch-nihayet bloğunu çalıştıran iş parçacığı [...] kesintiye uğradı" ile ne demek istiyorsun? Belki de belgelerin kötü yazılmış olması gerekir, ancak Thread.interrupt () yöntemi, denemeden veya catch bloğundan atılmış olsun, sonunda bloğun atlanmasına neden olmaz. Bu, Thread.stop () gibi daha şiddetli bir şey ifade etmek için "kesintiye uğradı" mı kullanıyor?
Joe Kearney

@Joe: Evet, bence belgesel burada biraz kötü ifade edilmiş ve iş parçacığının faaliyetinde genel bir kesinti olduğu anlamına geliyor.
GaryF

@GaryF - Sanırım JLS'den alıntı yapıyorsunuz. JLS'nin ifadeleri bazen biraz gariptir, ancak tipik olarak garip terminolojinin anlamının belgenin başka bir yerinde açıkça tanımlandığını göreceksiniz. JLS bir spesifikasyondur ve birincil hedefi olarak hassasiyet (okunabilirlik yerine) vardır.
Stephen C

1
@Stephen C - Aslında, JavaSE öğreticisinden gelen (başkaları tarafından bağlanan). Benzer şekilde JLS'de de ifade edilebilir, ancak ilgili kısmı bulamıyorum. Bunu bölüm 11 (İstisnalar), bölüm 14 (İfadeler) veya bölüm 15'te (İfadeler) bekliyordum, ancak kesinti ile ilgili kesin bir şey göremiyorum. Bunu görmekle kesinlikle ilgilenirim.
GaryF

1
@GaryF - Anlıyorum. Aslında JLS ifadelerin "normal" ve "ani" sonlandırılmasından bahseder ve terminolojiyi tanımlayan bir bölüm (14.1) vardır. Ardından davranışı finallynormal ve ani sonlandırmalar olarak belirtilir.
Stephen C

10

Evet.

Belgelere bakın :

Son blok her zaman try bloğu çıktığında yürütülür.

İstisnalar:

Not: JVM, try veya catch kodu yürütülürken çıkarsa, nihayet blok yürütülemeyebilir. Benzer şekilde, try veya catch kodunu yürüten iş parçacığı kesintiye uğrarsa veya öldürülürse, uygulama bir bütün olarak devam etse bile son olarak blok yürütülemeyebilir.


2

Son olarak, blok her zaman yürütür.

public class ExceptionTest {

public static void someFunction(String input) throws Exception {
    try {
        if( input.equals("ABC") ) {
            System.out.println("Matched");
        }
    } catch (Exception e) {
        throw new Exception(e);
    } finally {
        System.out.println("Input Is "+input+" Finally Executed!!!");
    }
}

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        System.out.println("********* Test with VALUE ********* ");
        someFunction("ABC");
        System.out.println("\r\n********* Test with NULL  ********* ");
        someFunction(null);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

Java Try Catch Sonunda Fırlatmayı Engelle


2

Sonunda davanız ne olursa olsun daima yürütülür.

  • try-catch-nihayet bloğu
  • atar

Denetlenmeyen özel durumlar için, java zorunlu değildir, hata işleme. bu nedenle, sonunda blokta denetlenmeyen bir istisna oluşursa ve bunun için herhangi bir işlem yapılmazsa, bu noktanın altına yazılan kod (hatanın oluştuğu yer) yürütülmez.

Bu yüzden, kontrol edilip edilmediğinden tüm istisnaları ele almanızı öneririm. Bu şekilde, denetlenmeyen istisna da olursa olsun, sonunda kod bloğunun da yürütüldüğünden emin olabilirsiniz. gerekli işi yapmak için alt yuva yakalama ve Son olarak engelleme yer var.



1

Evet. finallyblock, Java VM'yi durdurduğundan System.exit () öğesini çağırdığınız durumlar dışında her zaman yürütülür.


Kapatma kancaları hala System.exit () öğesinden sonra çağrılır, ancak varolan sistem dışı iş parçacıklarının tümü durdurulur.
Peter Lawrey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.