1. throwpengendali

Apabila pengecualian ditangkap oleh catchblok, dan sehingga ia dilemparkan ke mesin Java, ia hanyalah objek yang mewarisi Exception(atau lebih tepat, Throwable). Objek pengecualian itu sendiri tidak mempunyai sebarang sifat ajaib.

Semua logik tentang cara pengecualian berfungsi hanyalah cara khas mesin Java berkelakuan apabila pengecualian dilemparkan kepadanya.

Anda sentiasa boleh melemparkan semula pengecualian yang ditangkap pada mesin Java. Untuk melakukan ini, anda perlu menggunakan throwoperator:

throw exception;

Contoh:

Kod Output konsol
try
{
   int d = 2/0;
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

Dalam kod ini, kami menangkap pengecualian, memaparkan mesej mengenainya pada skrin, dan kemudian melemparkannya semula.

Pengecualian yang dilemparkan semula tidak boleh ditangkap oleh catchblok lain dalam tryblok yang sama.


2. Pengecualian anda

Ngomong-ngomong, anda boleh mencipta objek pengecualian sendiri: ia hanyalah objek yang jenisnya Exceptionatau kelas yang mewarisinya. Dan membuangnya.

Ia lebih mudah daripada kedengaran. Contoh:

Kod Output konsol
try
{
   throw new RuntimeException();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

Dalam contoh di atas, kami mencipta objek pengecualian baharu yang jenisnya RuntimeExceptiondan segera melemparkannya menggunakan throwoperator.

Ia akan segera ditangkap oleh catchblok, kerana RuntimeException mewarisi Exception. Kod ini catch (Exception except)menangkap objek pengecualian semua kelas yang mewarisi Exceptionkelas.



3. finallykata kunci

Satu lagi perkara penting. Kadangkala pengaturcara perlu melakukan beberapa tindakan tanpa mengira sama ada pengecualian berlaku dalam kod. Sebagai contoh, katakan kita membuka fail untuk menulis. Fail yang dibuka mesti ditutup dengan memanggil close().

try
{
   // Code where an exception might occur
}
catch(ExceptionType name)
{
   // Exception handling code
}
finally
{
   // Code that must executed no matter what happens
}

Untuk melaksanakan tindakan mandatori ini, satu lagi jenis blok ( finally) telah ditambahkan pada try-catchkonstruk, dengan itu mencipta try-catch-finallykonstruk. Ia kelihatan seperti ini:

Contoh:

FileInputStream source = null;
try
{
   source = new FileInputStream("c:\\note.txt");
   source.read();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
finally
{
   if (source != null)
      source.close();
}

Kod dalam finallyblok akan dilaksanakan dalam apa jua keadaan, tidak kira sama ada terdapat pengecualian. Walaupun pengecualian dilemparkan dan tidak ditangkap, finallyblok itu masih akan dilaksanakan.

Ngomong-ngomong, jika anda tidak mahu menangkap pengecualian, tetapi anda memerlukan blok finally, gunakan notasi trengkas untuk try-catch-finallybinaan: try-finallyblok. Ia kelihatan seperti ini:

try
{
   // Code where an exception might occur
}
finally
{
   // Code that must executed no matter what happens
}