FileNotFoundException di Java

1. Pengenalan

Dalam artikel ini, kita akan membincangkan pengecualian yang sangat biasa di Java - FileNotFoundException .

Kami akan membincangkan kes-kes apabila ia berlaku, kemungkinan cara mengatasinya dan beberapa contoh.

2. Bilakah Pengecualian Dilempar?

Seperti yang ditunjukkan pada dokumentasi API Java, pengecualian ini dapat dilemparkan ketika:

  • Sebuah fail dengan nama laluan yang dinyatakan tidak tidak wujud
  • Fail dengan nama jalan yang ditentukan memang ada tetapi tidak dapat diakses untuk beberapa alasan (penulisan yang diminta untuk fail hanya baca, atau izin tidak membenarkan mengakses fail)

3. Bagaimana Mengatasinya?

Pertama sekali, dengan mengambil kira bahawa ia meluaskan java.io.IOException yang meluaskan java.lang.Exception , anda perlu menghadapinya dengan blok cubaan tangkapan seperti mana pun E xception lain yang diperiksa .

Kemudian, apa yang harus dilakukan (berkaitan dengan perniagaan / logik) di dalam blok cubaan menangkap sebenarnya bergantung pada apa yang perlu anda lakukan.

Anda mungkin perlu:

  • Naikkan pengecualian khusus perniagaan: ini mungkin merupakan kesalahan pelaksanaan berhenti, tetapi anda akan meninggalkan keputusan di lapisan atas aplikasi (jangan lupa untuk memasukkan pengecualian asal)
  • Maklumkan pengguna dengan dialog atau mesej ralat: ini bukan kesalahan pelaksanaan berhenti, jadi pemberitahuan sudah cukup
  • Buat fail: membaca fail konfigurasi pilihan, tidak mencarinya dan membuat yang baru dengan nilai lalai
  • Buat fail di jalan lain: anda perlu menulis sesuatu dan jika jalan pertama tidak tersedia, anda mencuba dengan fail yang gagal
  • Hanya log ralat: ralat ini tidak boleh menghentikan pelaksanaannya tetapi anda mencatatnya untuk analisis masa depan

4. Contohnya

Sekarang kita akan melihat beberapa contoh, yang semuanya berdasarkan kelas ujian berikut:

public class FileNotFoundExceptionTest { private static final Logger LOG = Logger.getLogger(FileNotFoundExceptionTest.class); private String fileName = Double.toString(Math.random()); protected void readFailingFile() throws IOException { BufferedReader rd = new BufferedReader(new FileReader(new File(fileName))); rd.readLine(); // no need to close file } class BusinessException extends RuntimeException { public BusinessException(String string, FileNotFoundException ex) { super(string, ex); } } }

4.1. Mencatat Pengecualian

Sekiranya anda menjalankan kod berikut, ia akan "log" ralat di konsol:

@Test public void logError() throws IOException { try { readFailingFile(); } catch (FileNotFoundException ex) { LOG.error("Optional file " + fileName + " was not found.", ex); } }

4.2. Meningkatkan Pengecualian Khusus Perniagaan

Seterusnya, contoh meningkatkan pengecualian khusus perniagaan supaya kesalahan dapat ditangani di lapisan atas:

@Test(expected = BusinessException.class) public void raiseBusinessSpecificException() throws IOException { try { readFailingFile(); } catch (FileNotFoundException ex) { throw new BusinessException( "BusinessException: necessary file was not present.", ex); } }

4.3. Membuat Fail

Akhirnya, kami akan cuba membuat fail tersebut sehingga dapat dibaca (mungkin untuk utas yang terus membaca fail), tetapi sekali lagi menangkap pengecualian dan menangani kemungkinan ralat kedua:

@Test public void createFile() throws IOException { try { readFailingFile(); } catch (FileNotFoundException ex) { try { new File(fileName).createNewFile(); readFailingFile(); } catch (IOException ioe) { throw new RuntimeException( "BusinessException: even creation is not possible.", ioe); } } }

5. Kesimpulan

Dalam penulisan ringkas ini, kita telah melihat bila FileNotFoundException boleh berlaku dan beberapa pilihan untuk mengatasinya.

Seperti biasa, contoh penuh ada di Github.