Try-Nihayet ve Try-Yakalama Arasındaki Fark


91

Arasındaki fark nedir

try {
    fooBar();
} finally {
    barFoo();
}

ve

try {
  fooBar();
} catch(Throwable throwable) {
    barFoo(throwable); // Does something with throwable, logs it, or handles it.
}

İkinci versiyonu daha çok seviyorum çünkü bana Throwable'a erişim sağlıyor. İki varyasyon arasında herhangi bir mantıksal fark veya tercih edilen bir kural var mı?

Ayrıca, istisnaya final cümlesinden erişmenin bir yolu var mı?

Yanıtlar:


121

Bunlar iki farklı şey:

  • Catch bloğu yalnızca try bloğunda bir istisna atılırsa çalıştırılır.
  • Bir istisna atılırsa veya atılmazsa, nihayet bloğu her zaman try (-catch) bloğundan sonra yürütülür.

Örneğinizde üçüncü olası yapıyı göstermediniz:

try {
    // try to execute this statements...
}
catch( SpecificException e ) {
    // if a specific exception was thrown, handle it here
}
// ... more catches for specific exceptions can come here
catch( Exception e ) {
    // if a more general exception was thrown, handle it here
}
finally {
    // here you can clean things up afterwards
}

Ve @codeca'nın yorumunda dediği gibi, ultimate bloğunun içindeki istisnaya erişmenin bir yolu yoktur, çünkü bir istisna olmasa bile final bloğu yürütülür.

Elbette, istisnayı bloğunuzun dışında tutan bir değişken tanımlayabilir ve catch bloğunun içine bir değer atayabilirsiniz. Daha sonra bu değişkene nihai bloğunuzun içinden erişebilirsiniz.

Throwable throwable = null;
try {
    // do some stuff
}
catch( Throwable e ) {
    throwable = e;
}
finally {
    if( throwable != null ) {
        // handle it
    }
}

11
Bu durumun doğal bir sonucu böyle olduğunu olamaz erişmek Throwabledan finallyorada olmayabilir çünkü, bloğun olmak bir Throwable.
Dean Harding

11

Bunlar varyasyon değil, temelde farklı şeyler. her zaman , yalnızca bir istisna meydana geldiğinde finallyyürütülür .catch


7

Son olarak ve yakalama blokları oldukça farklıdır:

  • Catch bloğu içinde, atılan istisnaya yanıt verebilirsiniz. Bu blok , yalnızca işlenmemiş bir istisna varsa ve tür, catch bloğunun parametresinde belirtilenin alt sınıfıyla eşleştiğinde veya alt sınıfıysa çalıştırılır.
  • Son olarak , bir istisna olsa da olmasa da, deneme ve yakalama bloklarından sonra daima çalıştırılacaktır .

Yani

try {
  //some code
}
catch (ExceptionA) {
  // Only gets executed if ExceptionA 
  // was thrown in try block
}
catch (ExceptionB) {
  // Only executed if ExceptionB was thrown in try 
  // and not handled by first catch block
}

farklı

try {
  //some code
}
finally {
  // Gets executed whether or not 
  // an exception was thrown in try block
}

önemli ölçüde.

Bir try bloğu tanımlarsanız, tanımlamanız gerekir

  1. sonunda bir blok veya
  2. bir veya daha fazla yakalama bloğu veya
  3. bir veya daha fazla yakalama bloğu ve bir nihayet blok

Dolayısıyla aşağıdaki kod da geçerli olacaktır:

try {
  //some code
}
catch (ExceptionA) {
  // Only gets executed if 
  // ExceptionA was thrown in try block
}
catch (ExceptionB) {
  // Only executed if ExceptionB was thrown in 
  // try and not handled by first catch block
}
//even more catch blocks
finally {
  // Gets executed whether or not an 
  // exception was thrown in try block
}

4

try bir istisna atabilecek bir yöntemi çalıştırmak için kullanılır

catch bu istisnayı "yakalamak" için kullanılır

finally bu istisnanın yakalanması veya yakalanmaması nedeniyle gereken temizlik için kullanılır

try{
    myObject.riskyMethod(); // run a method that may throw an exception
}
catch(Exception ex){
    myLogger.log(ex.Message); // "catch" stop that exception
}
finally{
    myObject = null; // clean up needed from that exception being caught
}

3
try {
    statements;
} catch (exceptionType1 e1) {      // one or multiple
    statements;                 
} catch (exceptionType2 e2) {
    statements;
}    
...
} finally {                                 // one or none
    statements;
}
  1. Tüm try deyimleri ya bir catch cümlesi ya da bir last cümlesi içermelidir
  2. Birden çok catch cümlesine sahip olabilir, ancak yalnızca bir nihayet cümlesi olabilir
  3. Herhangi bir yürütme sırasında herhangi bir hata meydana gelirse, Kontrol uygun Catch bloğuna aktarılır ve ifadeleri yürütür ve Son olarak bloğu çalıştırılır.

Ne Olursa Olsun Nihayet bloğu her zaman yürütülür, Genel olarak, Sonunda blok kullanılır, oturumlarınız olduğunda, Veritabanı bağlantılarınız veya Dosyalarınız veya soketleriniz açık olduğunda, bu bağlantıları kapatmak için kod yerleştirilecektir. Bu sadece bir uygulamada bellek sızıntısı olmadığından veya başka herhangi bir sorunun meydana gelmemesinden emin olmak içindir.


3

Son olarak ve yakalama blokları oldukça farklıdır:

Catch bloğu içinde, atılan istisnaya yanıt verebilirsiniz. Bu blok, yalnızca işlenmemiş bir istisna varsa ve tür, catch bloğunun parametresinde belirtilenin alt sınıfıyla eşleştiğinde veya alt sınıfıysa çalıştırılır. Son olarak, bir istisna olsa da olmasa da, deneme ve yakalama bloklarından sonra daima çalıştırılacaktır.


2

Araştırmam Sonunda bloğu her zaman yürütülür ve esas olarak "herhangi bir açık bağlantının kapanması için kullanılır" ve gereksiz yere çalışan bir şeyi yok etmek için kullanılır.


2

Genellikle akışlar, bağlantılar vb. Gibi kaynakları kullandığımızda, bunları açık bir şekilde nihayet blok kullanarak kapatmamız gerekir. Aşağıda verilen programda FileReader kullanarak bir dosyadan veri okuyoruz ve ultimate block kullanarak kapatıyoruz.

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadData_Demo {

   public static void main(String args[]){
      FileReader fr=null;       
      try{
         File file=new File("file.txt");
         fr = new FileReader(file);  char [] a = new char[50];
         fr.read(a); // reads the content to the array
         for(char c : a)
         System.out.print(c); //prints the characters one by one
      }catch(IOException e){
          e.printStackTrace();
       }
       finally{ 
          try{
              fr.close();
          }catch(IOException ex){       
               ex.printStackTrace();
           }
       }
    }

}

Belki benim gibi başka adamlar böyle bir şey aradı.

Bu sayfadaki bilgiler tutpoint


1

Son olarak, blok her zaman yürütülür. Yakalama bloğu, yalnızca bloklar parametresiyle eşleşen bir istisna yakalandığında çalıştırılır.


1

İlk formda bile onu arama yöntemine kaydedebilirsiniz. Bu nedenle, orada bazı özel işlemler yapmak istemediğiniz sürece büyük bir avantaj yoktur.


0

Try bloğu, istisna yaratacak ifadeleri tutacaktır. Catch bloğu, try bloğundan atılan referansı tutacak ve gerekli mesajlar catch bloğundan üretilecektir. Son olarak blok, io kapatma, dosya kapatma, dB kapatma gibi kullanılan kaynakları kapatmak için de kullanılır. Java'da -9 gelişmiş deneme kaynağı, kaynakların try..in kaynakla güçlendirilmiş deneme dışında bildirildiği yerde, catch bloğu zorunludur

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.