Java'da Try With Resource Nasıl Kullanılır

Feb 21 2023
Try-with-resource deyimi kullanılarak istisnalar nasıl ele alınır Java try with resources yapısı, AKA Java try-with-resources, Java InputStream veya JDBC Connection gibi kaynakları işiniz bittiğinde otomatik olarak kapatabilen bir istisna işleme mekanizmasıdır. . Oracle, ağ soketleri, veritabanı bağlantıları ve dosya ve klasör referansları gibi nesnelerin kullanımdan sonra temiz bir şekilde sonlandırılmasını garanti etmeye yardımcı olmak için 2011'de Java diline try with resources yapısını ekledi.

Try-with-resource deyimi kullanılarak istisnalar nasıl ele alınır?

Kaynaklarla Java deneyin yapısı, diğer adıyla Java try-with-resources , Java InputStream veya JDBC Connection gibi kaynakları işiniz bittiğinde otomatik olarak kapatabilen bir istisna işleme mekanizmasıdır.

Oracle, ağ soketleri, veritabanı bağlantıları ve dosya ve klasör referansları gibi nesnelerin kullanımdan sonra temiz bir şekilde sonlandırılmasını garanti etmeye yardımcı olmak için 2011'de Java diline try with resources yapısını ekledi. Bir geliştirici onlara bir tanıtıcı açtıktan sonra bu kaynakların kapatılmaması, bellek sızıntılarına neden olabilir , önlenebilir çöp toplama rutinlerini tetikleyebilir ve bir sunucunun CPU'sunu zorlayabilir .

· Java 7'den Önce
· Kaynakla deneyin ifadesi nasıl kullanılır?
· Neden try-with-resource deyimini kullanmak zorundayım?
· Örnek
· Bastırılmış İstisnalar
· Kaynaklarla deneyin kullanmanın avantajları
· Birden Fazla Kaynakla Kaynaklarla Deneyin
· Java 9 — Etkili Son Değişkenler

Java 7'den önce

Java'da, giriş veya çıkış akışları gibi bir kaynak kullanıyorsanız, kullandıktan sonra her zaman kapatmanız gerekir. Ayrıca bir try-catch bloğunda olması için istisnalar atabilir . Kapanış, nihayet bloğunda olmalıdır . Bu, en azından Java 7'ye kadar olan yoldur. Bunun birkaç dezavantajı vardır:

  • Kapatmadan önce kaynağınızın boş olup olmadığını kontrol etmeniz gerekir.
  • Kapanış kendisi istisnalar atabilir, bu yüzden sonunda başka bir try-catch içermek zorunda kaldınız.
  • Programcılar genellikle kaynaklarını kapatmayı unuturlar.

Kaynakla deneyin ifadesi nasıl kullanılır?

Başlangıçta Java 7'de tanıtıldı ve arkasındaki tüm fikir, geliştiricinin yalnızca bir try-catch-finally bloğunda kullandıkları kaynaklar için kaynak yönetimi konusunda endişelenmesine gerek olmamasıydı . Bu , geliştiricilerin pratikte yalnızca kaynakları kapatmak için kullandıkları nihayet bloklarına olan ihtiyacı ortadan kaldırarak elde edilir .

Java'da, try-with-resources ifadesi, bir veya daha fazla kaynağı bildiren bir try ifadesidir. Kaynak, program bittikten sonra kapatılması gereken bir nesne gibidir. Yürütme, try-with-resources bloğundan ayrıldığında, try-with-resources bloğu içinde açılan herhangi bir kaynak, try-with-resources bloğunun içinden veya kapatmaya çalışıldığında herhangi bir istisna atılıp atılmadığına bakılmaksızın otomatik olarak kapatılır. Kaynaklar.

Java'nın kaynaklarla dene dili özelliğini kullanmak için aşağıdaki kurallar geçerlidir:

  • Kaynaklarla deneyin ifadesi tarafından yönetilen tüm nesneler, AutoCloseable arabirimini uygulamalıdır.
  • Birden çok AutoCloseable nesnesi, Java'nın try with links bloğunda oluşturulabilir.
  • Bir try with links deyiminde belirtilen nesnelerin kapsamı try bloğu içindedir, ancak catch ve finally bloklarında yoktur.
  • Bir try with links bloğunda bildirilen nesnelerin close() yöntemi, yürütme sırasında bir istisna atılıp atılmadığına bakılmaksızın çağrılır.
  • close() yönteminde bir istisna atılırsa, bastırılmış bir istisna olarak kategorize edilebilir .

AutoCloseable nesnesi tarafından başvurulan kaynak, bir try with links ifadesi kullanılırsa her zaman kapatılır ve genellikle kaynakların yanlış tahsis edilmesinden kaynaklanan olası bellek sızıntıları ortadan kaldırılır.

Sözdizimi

try(declare resources here) {
    // use resources
}
catch(FileNotFoundException e) {
    // exception handling
}

Basitçe söylemek gerekirse, otomatik olarak kapatılmak için bir kaynağın try içinde hem bildirilmesi hem de başlatılması gerekir :

try (PrintWriter writer = new PrintWriter(new File("test.txt"))) {
    writer.println("Hello World");
}

Yeni try-with-resources işlevini kullanmanın basit ve açık yolu, geleneksel ve ayrıntılı try-catch-finally bloğunu değiştirmektir .

Aşağıdaki kod örneklerini karşılaştıralım.

İlki, tipik bir try-catch-finally bloğudur:

Scanner scanner = null;
try {
    scanner = new Scanner(new File("test.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (scanner != null) {
        scanner.close();
    }
}"); background-repeat: no-repeat; background-position: center center; background-color: rgb(99, 177, 117);">Copy

try (Scanner scanner = new Scanner(new File("test.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException fnfe) {
    fnfe.printStackTrace();
}

İstisnalar söz konusu olduğunda, try-catch-finally bloğu ile try-with-resources bloğu arasında bir fark vardır. Hem try bloğunda hem de finally bloğunda bir istisna atılırsa, yöntem nihayet bloğunda atılan istisnayı döndürür.

try-with-resources için, try bloğunda ve try-with-resources deyiminde bir istisna atılırsa, yöntem try bloğunda atılan istisnayı döndürür. try-with-resources tarafından atılan istisnalar bastırılır, yani try-with-resources bloğunun bastırılan istisnalar fırlattığını söyleyebiliriz.

Neden try-with-resource deyimini kullanmak zorundayım?

try-with-resources ifadesi, ifade yürütmesinin sonunda her kaynağın kapatılmasını sağlar . Kaynakları kapatmazsak, bu bir kaynak sızıntısı oluşturabilir ve ayrıca program kendisine sunulan kaynakları tüketebilir. try-catch-finally bloğunu kullandığınızda çoğunlukla olan buydu

Java SE 7'den önce, try deyiminin normal veya aniden tamamlanmasına bakılmaksızın bir kaynağın kapatıldığından emin olmak için bir finally bloğu kullanabilirsiniz . Aşağıdaki örnek, try -with-resources deyimi yerine bir finally bloğu kullanır:

static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
   
    FileReader fr = new FileReader(path);
    BufferedReader br = new BufferedReader(fr);
    try {
        return br.readLine();
    } finally {
        br.close();
        fr.close();
    }
}

Bu örnekte, readLine yöntemi bir istisna atarsa ​​ve finally bloğundaki br.close() ifadesi bir istisna atarsa, FileReader sızdırmıştır . Bu nedenle, programınızın kaynaklarını kapatmak için bir finally bloğu yerine bir try -with-resources ifadesi kullanın.

Örnek

Aşağıdaki örnek, bir dosyadan ilk satırı okur. Dosyadan veri okumak için bir FileReader ve BufferedReader örneğini kullanır . FileReader ve BufferedReader , program bittikten sonra kapatılması gereken kaynaklardır:

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());
    }
  }
}

Gizli İstisnalar

Bir try bloğu bir istisna atarsa ​​ve try-with-resources tarafından bir veya daha fazla istisna fırlatılırsa, try-with-resources tarafından oluşturulan istisnalar bastırılır. Başka bir deyişle, try-with-resources tarafından atılan istisnaların bastırılmış istisnalar olduğunu söyleyebiliriz.

Bu istisnaları, Throwable sınıfının getSuppress() yöntemini kullanarak elde edebilirsiniz.

Örnek :

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

  • test.txt dosyası bulunamadı.
  • BufferedReader nesnesini kapatma .

Hem try bloğundan hem de t ry-with-resources deyiminden istisnalar atılırsa , try bloğundan istisna atılır ve try-with-resources deyiminden istisna bastırılır.

Bastırılmış İstisnaları Alma

Java 7 ve sonrasında, try bloğu tarafından atılan istisnadan Throwable.getSuppressed() yöntemi çağrılarak bastırılan istisnalar alınabilir .

getSuppress() Try-with-resources deyimi tarafından bastırılan tüm istisnaları içeren bir dizi döndürür. Hiçbir istisna bastırılmamışsa veya gizleme devre dışı bırakılmışsa, boş bir dizi döndürülür.

Susturulmuş istisnaları catch bloğunda alırız .

catch(IOException e) {
  System.out.println("Thrown exception=>" + e.getMessage());
  Throwable[] suppressedExceptions = e.getSuppressed();
  for (int i=0; i<suppressedExceptions.length; i++) {
    System.out.println("Suppressed exception=>" + suppressedExceptions[i]);
  }
}

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

  • Daha okunabilir kod ve yazması kolay.
  • Otomatik kaynak yönetimi.
  • Kod satırı sayısı azaltıldı.
  • Try-with-resources'da birden fazla kaynak açıldığında, herhangi bir bağımlılık sorununu önlemek için bunları ters sırada kapatır.

Java 7 bu özelliği sunmadan önce, kaynak sızıntılarını önlemek için kaynağın kapalı olduğundan emin olmak için nihayet bloğu kullanmak zorundaydık .

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

Örnek: Nihayet bloğunu 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());
      }
    }
  }
}

Entering try block
Line =>line from test.txt file
Entering finally block

try…catch bloğuna da nihayet bloğunda dikkat edin ? Bunun nedeni, bu nihayet bloğu içindeki BufferedReader örneğini kapatırken de bir IOException oluşabilmesidir, böylece bu da yakalanır ve işlenir.

try -with-resources deyimi otomatik kaynak yönetimi yapar . JVM kaynakları otomatik olarak kapattığı için kaynakları açıkça kapatmamız gerekmez. Bu, kodu daha okunabilir ve yazılması daha kolay hale getirir.

Birden Fazla Kaynakla Kaynakları Deneyin

Bir try-with-resources bloğunda birden fazla kaynağı noktalı virgülle ayırarak gayet iyi ilan edebiliriz :

try (Scanner scanner = new Scanner(new File("testRead.txt"));
    PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
    while (scanner.hasNext()) {
	writer.print(scanner.nextLine());
    }
}

Java 9'dan önce, taze değişkenleri yalnızca bir try-with-resources bloğu içinde kullanabiliyorduk :

try (Scanner scanner = new Scanner(new File("testRead.txt")); 
    PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) { 
    // omitted
}"); background-repeat: no-repeat; background-position: center center; background-color: rgb(99, 177, 117);">Copy

final Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))
try (scanner;writer) { 
    // omitted
}"); background-repeat: no-repeat; background-position: center center; background-color: rgb(99, 177, 117);">Copy

Yukarıda gösterildiği gibi, tarayıcı değişkeni açık bir şekilde final olarak bildirildi , böylece onu try-with-resources bloğu ile kullanabiliriz . Yazar değişkeni kesin olarak nihai olmasa da , ilk atamadan sonra değişmez. Böylece, yazar değişkenini de kullanabiliriz .

Mutlu öğrenmeler

Mouad Oumous Java WhatsApp Grubuna Katılın

Mouad Oumous Telegram Kanalına Katılın

Yayınımızı takip ederek destek olun

Java'da ModelMapper ile Nesne Eşleme Kılavuzu Spring Boot'a Başlarken: Yeni Başlayanlar İçin Kapsamlı Bir Eğitim Spring Boot Security | TOA | Okta ile OAuth2 En Sık Sorulan Java8 Akışına Dayalı Mülakat Sorusu — Bölüm 2 Kodlama: Javascript'te bir diziyi düzleştirme En Sık Sorulan Java8 Akışına Dayalı Mülakat Sorusu — Bölüm 1