Java kaynakları ile deneme (Örneklerle)

Bu eğiticide, kaynakları otomatik olarak kapatmak için kaynaklarla dene deyimini öğreneceğiz.

try-with-resourcesİfadesi otomatik deyimi sonunda tüm kaynakları kapatır. Kaynak, programın sonunda kapatılacak bir nesnedir.

Sözdizimi şöyledir:

 try (resource declaration) ( // use of the resource ) catch (ExceptionType e1) ( // catch block ) 

Yukarıdaki sözdiziminden görüldüğü gibi, try-with-resourcesifadeyi şu şekilde beyan ederiz :

  1. trycümle içinde kaynağın bildirilmesi ve başlatılması .
  2. kaynak kapatılırken ortaya çıkabilecek tüm istisnaları belirleme ve işleme.

Not: Kaynakları ile dene deyimi, AutoCloseable arabirimini uygulayan tüm kaynakları kapatır.

İfadeyi uygulayan bir örnek alalım try-with-resources.

Örnek 1: Kaynaklarla deneme

 import java.io.*; class Main ( public static void main(String() args) ( String line; try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) ( while ((line = br.readLine()) != null) ( System.out.println("Line =>"+line); ) ) catch (IOException e) ( System.out.println("IOException in try block =>" + e.getMessage()); ) ) ) 

Test.txt dosyası bulunmazsa çıktı alınır.

 Kaynakları dene bloğunda IOException => test.txt (Böyle bir dosya veya dizin yok) 

Test.txt dosyası bulunursa çıktı alınır.

 Kaynakla deneme bloğuna giriliyor Satır => test satırı 

Bu örnekte, test.txtdosyadan veri okumak için BufferedReader örneğini kullanıyoruz .

BufferedReader'ın try-with-resourcesifadenin içinde bildirilmesi ve başlatılması, tryifadenin normal şekilde tamamlanmasına veya bir istisna atmasına bakılmaksızın örneğinin kapatılmasını sağlar .

Bir istisna meydana gelirse, istisna işleme blokları veya throws anahtar sözcüğü kullanılarak ele alınabilir.

Bastırılmış İstisnalar

Yukarıdaki örnekte, aşağıdaki durumlarda try-with-resourcesifadeden istisnalar atılabilir :

  • Dosya test.txtbulunamadı.
  • BufferedReaderNesneyi kapatmak .

Bir trydosya okuması herhangi bir zamanda birçok nedenden dolayı başarısız olabileceğinden , bloktan bir istisna da atılabilir .

Hem trybloktan hem de try-with-resourcesifadeden istisnalar tryatılırsa , bloktan istisna atılır ve try-with-resourcesifadeden istisna bastırılır.

Bastırılmış İstisnaları Geri Alma

Java 7 ve sonraki sürümlerde, blok Throwable.getSuppressed()tarafından atılan istisnadan yöntem çağrılarak bastırılan istisnalar alınabilir try.

Bu yöntem, tüm bastırılmış özel durumların bir dizisini döndürür. Bloktaki bastırılmış istisnaları alıyoruz catch.

 catch(IOException e) ( System.out.println("Thrown exception=>" + e.getMessage()); Throwable() suppressedExceptions = e.getSuppressed(); for (int i=0; i" + suppressedExceptions(i)); ) ) 

Kaynaklarla deneme kullanmanın avantajları

Kaynaklarla deneme kullanmanın avantajları şunlardır:

1. nihayet kaynağı kapatmak için blok gerekli değildir

Java 7 bu özelliği sunmadan önce, finallykaynak sızıntılarını önlemek için kaynağın kapatıldığından emin olmak için bloğu kullanmalıydık .

İşte Örnek 1'e benzer bir program . Ancak, bu programda, kaynakları kapatmak için nihayet blok kullandık.

Örnek 2: Son bloğu kullanarak kaynağı kapatın

 import java.io.*; class Main ( public static void main(String() args) ( BufferedReader br = null; String line; try ( System.out.println("Entering try block"); br = new BufferedReader(new FileReader("test.txt")); while ((line = br.readLine()) != null) ( System.out.println("Line =>"+line); ) ) catch (IOException e) ( System.out.println("IOException in try block =>" + e.getMessage()); ) finally ( System.out.println("Entering finally block"); try ( if (br != null) ( br.close(); ) ) catch (IOException e) ( System.out.println("IOException in finally block =>"+e.getMessage()); ) ) ) ) 

Çıktı

 Try block Line => satır test.txt dosyasından giriliyor Sonunda blok giriliyor 

Yukarıdaki örnekten de görebileceğimiz gibi, finallykaynakları temizlemek için blok kullanımı kodu daha karmaşık hale getirir.

Dikkat try… catchiçinde blok finallyyanı bloğun? Bunun nedeni, bu bloğun içindeki örneği IOExceptionkapatırken de bir meydana gelebilmesidir, böylece aynı zamanda yakalanır ve kullanılır.BufferedReaderfinally

try-with-resourcesİfadesi yapar otomatik kaynak yönetimini . JVM otomatik olarak kapattığı için kaynakları açık bir şekilde kapatmamıza gerek yoktur. Bu, kodu daha okunabilir ve yazmayı daha kolay hale getirir.

2. birden çok kaynakla kaynakları deneyin

İfadede birden fazla kaynağı try-with-resourcesnoktalı virgülle ayırarak bildirebiliriz;

Örnek 3: Birden çok kaynakla deneyin

 import java.io.*; import java.util.*; class Main ( public static void main(String() args) throws IOException( try (Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) ( while (scanner.hasNext()) ( writer.print(scanner.nextLine()); ) ) ) ) 

Bu program herhangi bir istisna oluşturmadan çalışırsa, Scannernesne testRead.txtdosyadan bir satırı okur ve yeni bir testWrite.txtdosyaya yazar .

Birden fazla bildirim yapıldığında, try-with-resourcesifade bu kaynakları ters sırada kapatır. Bu örnekte, önce PrintWriternesne kapatılır, ardından Scannernesne kapatılır.

Java 9 kaynaklarla deneme geliştirmesi

Java 7'de, try-with-resourcesifadede bir kısıtlama vardır . Kaynağın kendi bloğu içinde yerel olarak bildirilmesi gerekir.

 try (Scanner scanner = new Scanner(new File("testRead.txt"))) ( // code ) 

Java 7'de bloğun dışındaki kaynağı ilan etseydik, bir hata mesajı üretecekti.

 Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) ( // code ) 

Bu hatayı gidermek için Java 9 try-with-resources, yerel olarak bildirilmemiş olsa bile kaynağın referansı kullanılabilecek şekilde ifadeyi geliştirdi . Yukarıdaki kod artık herhangi bir derleme hatası olmadan yürütülecektir.

Ilginç makaleler...