1. thrownhà điều hành

Khi một ngoại lệ bị chặn bởi một catchkhối và cho đến khi nó được ném vào máy Java, nó chỉ là một đối tượng kế thừa Exception(hay đúng hơn là Throwable). Bản thân đối tượng ngoại lệ không có bất kỳ thuộc tính ma thuật nào.

Tất cả logic về cách hoạt động của các ngoại lệ chỉ là một cách đặc biệt mà máy Java hoạt động khi một ngoại lệ được ném vào nó.

Bạn luôn có thể vẽ lại một ngoại lệ bị bắt đối với máy Java. Để làm điều này, bạn cần sử dụng throwtoán tử:

throw exception;

Ví dụ:

Mã số Đầu ra bảng điều khiển
try
{
   int d = 2/0;
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

Trong mã này, chúng tôi đã bắt gặp một ngoại lệ, hiển thị thông báo về nó trên màn hình và sau đó viết lại nó.

Một ngoại lệ được viết lại không thể bị bắt bởi catchcác khối khác trong cùng một trykhối.


2. Ngoại lệ của bạn

Nhân tiện, bạn có thể tự tạo một đối tượng ngoại lệ: nó chỉ là một đối tượng có kiểu Exceptionhoặc một lớp kế thừa nó. Và ném nó.

Nó dễ dàng hơn âm thanh. Ví dụ:

Mã số Đầu ra bảng điều khiển
try
{
   throw new RuntimeException();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

Trong ví dụ trên, chúng ta đã tạo một đối tượng ngoại lệ mới có kiểu là RuntimeExceptionvà ném nó ngay lập tức bằng cách sử dụng throwtoán tử.

Nó sẽ bị chặn ngay lập tức catch, vì RuntimeException kế thừa Exception. Đoạn catch (Exception except)mã bắt các đối tượng ngoại lệ của tất cả các lớp kế thừa Exceptionlớp đó.



3. finallytừ khóa

Một điểm quan trọng khác. Đôi khi một lập trình viên cần thực hiện một số hành động bất kể có ngoại lệ xảy ra trong mã hay không. Ví dụ: giả sử chúng tôi đã mở một tệp để viết. Tệp đã mở phải được đóng bằng cách gọi close().

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

Để thực hiện các hành động bắt buộc này, một loại khối khác ( finally) đã được thêm vào try-catchcấu trúc, do đó tạo try-catch-finallycấu trúc. Nó trông như thế này:

Ví dụ:

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

Mã trong finallykhối sẽ thực thi trong mọi trường hợp, bất kể có ngoại lệ hay không. Ngay cả khi một ngoại lệ được ném ra và không bị bắt, finallykhối vẫn sẽ thực thi.

Nhân tiện, nếu bạn không muốn bắt một ngoại lệ, nhưng bạn cần một finallykhối, hãy sử dụng ký hiệu tốc ký cho try-catch-finallycấu trúc: một try-finallykhối. Nó trông giống như thế này:

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