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-resources
ifadeyi şu şekilde beyan ederiz :
try
cümle içinde kaynağın bildirilmesi ve başlatılması .- 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.txt
dosyadan veri okumak için BufferedReader örneğini kullanıyoruz .
BufferedReader'ın try-with-resources
ifadenin içinde bildirilmesi ve başlatılması, try
ifadenin 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-resources
ifadeden istisnalar atılabilir :
- Dosya
test.txt
bulunamadı. BufferedReader
Nesneyi kapatmak .
Bir try
dosya okuması herhangi bir zamanda birçok nedenden dolayı başarısız olabileceğinden , bloktan bir istisna da atılabilir .
Hem try
bloktan hem de try-with-resources
ifadeden istisnalar try
atılırsa , bloktan istisna atılır ve try-with-resources
ifadeden 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, finally
kaynak 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, finally
kaynakları temizlemek için blok kullanımı kodu daha karmaşık hale getirir.
Dikkat try… catch
içinde blok finally
yanı bloğun? Bunun nedeni, bu bloğun içindeki örneği IOException
kapatırken de bir meydana gelebilmesidir, böylece aynı zamanda yakalanır ve kullanılır.BufferedReader
finally
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-resources
noktalı 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, Scanner
nesne testRead.txt
dosyadan bir satırı okur ve yeni bir testWrite.txt
dosyaya yazar .
Birden fazla bildirim yapıldığında, try-with-resources
ifade bu kaynakları ters sırada kapatır. Bu örnekte, önce PrintWriter
nesne kapatılır, ardından Scanner
nesne kapatılır.
Java 9 kaynaklarla deneme geliştirmesi
Java 7'de, try-with-resources
ifadede 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.