Soru Sonunda yakalamayı denemek iyi mi?


Tamponlu bir yazar ve kodumu kullanıyorum, yazarın son blokta kapatır. Benim kodum böyle.

 ...........
    BufferedWriter theBufferedWriter = null;
    try{
    theBufferedWriter =.....
    ....
    ......
    .....
    } catch (IOException anException) {
    ....
    } finally {
        try {
            theBufferedWriter.close();              
        } catch (IOException anException) {
            anException.printStackTrace();
            }
    }

Temizleyici kod içinde try catch'unu kullanmam gerekiyor, çünkü TheBufferedWriter bir IOException'ı da atabiliyor. Bu istisnayı çağrı yöntemlerine atmak istemiyorum. Sonunda bir deneme yakalamak için iyi bir uygulama mı? Yoksa alternatif nedir? Lütfen öneriniz.

Saygılarımızla, Hiral


21
2018-06-16 07:07


Menşei


Sorun değil, önce null'u kontrol etmek daha iyi. - qrtt1
+1 Güzel değil ama yapılması gerekiyor - Robben_Ford_Fan_boy


Cevaplar:


Bunu yapmak için biraz daha güzel bir yol kullanmaktır IOUtils.closeQuiety Apache'den commons-io. Kodunuzu düzenli olarak saklar ve Java'da bulunan bazı kazanları ortadan kaldırır.

Kod yazarsın:

BufferedWriter theBufferedWriter = null;
try{
    theBufferedWriter = ...
    ...
} catch (IOException anException) {
    ...
} finally {
    IOUtils.closeQuietly(theBufferedWriter);
}

Çok daha güzel ve daha anlamlı.


14
2018-06-16 07:12



Tamponlu bir yazarın bunun gibi kapatılması risklidir; karakterler arabelleğin içinde kalıyorsa ve kapatmaya çalışırken yakın bir istisna atarsa, veriler kesilir ve uygulamanız hatayı işlemez. Bunu güvenli hale getirmek için araman gerekecek close catch bloğundan hemen önce. - McDowell
@McDowell: Bilinmesi güzel. Muhtemelen arayabilirsin. flush() yakalama bloğundan da önce, değil mi? - scompt.com
arabelleği kapatarak temizleyecektir (javadoc'a bakın). Açık olmadığı takdirde, bu desen gerektirir close iki kez çağrılacak. Eğer taşındıysanız Sonunda {yakın} / denemek mevcut olana Deneyin blok, sadece 1) aramak gerekir close bir kez 2) gereksizden kaçının null ödev 3) bir 3. parti kütüphanesi almanıza gerek yoktur. İç içe geçmiş trys çirkin görünüyor, ancak genelde bu işlemin yerel olarak ele alınmasıyla ilgili kararlar veremiyorsunuz, bu nedenle yakalama bloğu bir çağrıyı arayan yığında daha fazla arar. illegalargumentexception.blogspot.com/2008/10/... - McDowell


Java 7 öncesi, yazdıkların en iyi çözüm olduğunu söyleyebilirim.

Java 7'de ve sonrasında Otomatik Kaynak Yönetimi Bu şeyleri basitleştirmek için tasarlanmıştır. Bu özellik ile yapabilirsiniz

BufferedWriter theBufferedWriter = null;
try (BufferedWriter theBufferedWriter = ...) {
....
......
.....
} catch (IOException anException) {
....
}

12
2018-06-16 07:08



Kaynak denemeye katılıyorum, Java 7'den beri en iyi yaklaşım: docs.oracle.com/javase/tutorial/essential/exceptions/... - JavaDev


Ya da kullanabilirsiniz Lombok ve @Cleanup ek açıklama ve bir daha asla tekrar bir deneyin yakalama yazamazsınız.

Normalde yazdığınız şey budur (Not throws IOException):

//Vanilly Java

import java.io.*;

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
      OutputStream out = new FileOutputStream(args[1]);
      try {
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      } finally {
        out.close();
      }
    } finally {
      in.close();
    }
  }
}

Şimdi Lombok ile yazarsın @Cleanup akışlarda

import lombok.Cleanup;
import java.io.*;

 public class CleanupExample {
   public static void main(String[] args) throws IOException {
     @Cleanup InputStream in = new FileInputStream(args[0]);
     @Cleanup OutputStream out = new FileOutputStream(args[1]);
     byte[] b = new byte[10000];
     while (true) {
       int r = in.read(b);
       if (r == -1) break;
       out.write(b, 0, r);
     }
   }
 }

2
2018-06-16 07:14





Java 7'ye kadar yaşayacağımız şey budur ve ARM Blokları.


1
2018-06-16 07:13





Tamam ama test edip theBufferedWriter kapatmadan önce null değildir.
Ayrıca şunları da yapabilirsiniz:

BufferedWriter theBufferedWriter;
try {
    theBufferedWriter = new ...
    try {
        ...
    } finally {
        try {
            theBufferedWriter.close();
        } catch (IOException closeException) {
            closeException.printStackTrace();
        }
    }
} catch (IOException anException) {
    ...
}

veya:

BufferedWriter theBufferedWriter;
try {
    theBufferedWriter = new ...
} catch (IOException createException) {
    // do something with createException 
    return;  // assuming we are in a method returning void
}

try {
    ...
} catch (IOException anException) {
    ...
    // assuming we don't return here
}

try {
    theBufferedWriter.close();
} catch (IOException closeException) {
    closeException.printStackTrace();
}

fakat çoğunlukla, özel bir yöntemde bu tür işlemleri (ör. bir dosya yazma) yapıyorum ve / veya bir istisnayı, arayan kişinin ele alabilmesi için atmayı tercih ediyorum (örneğin, başka bir dosya isteme, uygulamayı durdurma ...):

void someMethod(...) throws IOException {
    BufferedWriter theBufferedWriter = new ...

    try {
        ...
    } catch (IOExcepption anException) {
        try {
            theBufferedWriter.close();
        } catch (IOException closeException) {
            closeException.printStackTrace();
            // closeException is not thrown, anException represents the main/first problem
        }
        throw anException;
    }

    theBufferedWriter.close();  //  throws the Exception, if any
}

Lütfen dikkat: İngilizce benim ilk ve ikinci dilim değil, herhangi bir yardım takdir edilecektir


1
2018-06-16 07:37





Sonunda bir deneme yapmak güzel. Yapmak istediğiniz şeyi yapan araçtır. Bununla birlikte, atılan IOException komutunun, kendisinde olduğu gibi herhangi bir istisnayı bastırmasına izin verecek kadar nadir olduğunu hissediyorum.

try {
    BufferedWriter writer = .....
    try {
        .....
    } finally {
       writer.close();
    }
 } catch (IOException e) {
     ....
 }

0
2018-06-16 14:42