Xử lý ngoại lệ trong Java

⚡ Tóm tắt thông minh

Java Xử lý ngoại lệ cung cấp một cơ chế có cấu trúc để quản lý các lỗi thời gian chạy làm gián đoạn luồng chương trình bình thường. Nó sử dụng các từ khóa try, catch, finally, throw và throws để phát hiện, cô lập và phục hồi từ các điều kiện bất thường trong khi vẫn duy trì tính ổn định.ping Ứng dụng mạnh mẽ và dễ dự đoán.

  • ⚠️ Ngoại lệ được định nghĩa: Ngoại lệ là một sự kiện xảy ra trong quá trình thực thi, làm gián đoạn trình tự thực thi tiêu chuẩn và được biểu diễn dưới dạng một đối tượng mô tả tình trạng lỗi.
  • 🧯 Khối Try Catch: Hãy đặt đoạn mã tiềm ẩn rủi ro bên trong khối try và theo sau đó là một hoặc nhiều khối catch để bắt các loại ngoại lệ cụ thể một cách khéo léo.
  • 🔁 Cuối cùng là hành vi: Khối finally luôn được thực thi sau khối try và catch, do đó rất lý tưởng để đóng các tập tin, socket hoặc giải phóng các tài nguyên hệ thống khác.
  • Thứ tự ưu tiên xử lý ngoại lệ: Tất cả các ngoại lệ đều kế thừa từ Throwable, từ đó phân nhánh thành Error và Exception, trong đó RuntimeException xử lý các trường hợp không được kiểm tra như chia cho 0.
  • 🧪 Thực hành tốt nhất: Hãy ưu tiên bắt ngoại lệ cụ thể nhất trước, tránh sử dụng các khối catch rỗng, ghi nhật ký các thông báo có ý nghĩa và sử dụng nhiều khối catch để giữ cho mã ngắn gọn và dễ bảo trì.

Xử lý ngoại lệ trong Java

Ngoại lệ là gì trong Java?

An Ngoại lệ trong Java Lỗi là một sự kiện làm gián đoạn việc thực thi các lệnh của chương trình và làm xáo trộn luồng thực thi bình thường của chương trình. Nó là một đối tượng bao bọc thông tin về sự kiện lỗi xảy ra trong một phương thức và được truyền đến hệ thống thời gian chạy. JavaCác ngoại lệ chủ yếu được sử dụng để báo hiệu các loại lỗi khác nhau, giúp các nhà phát triển có thể xử lý chúng một cách có kiểm soát.

Có hai loại lỗi chính trong Java:

  1. Biên dịch lỗi thời gian
  2. Lỗi thời gian chạy

Lỗi biên dịch có thể được phân loại thành hai loại nhỏ hơn nữa:

  • Lỗi cú pháp
  • Lỗi ngữ nghĩa

Ví dụ về lỗi cú pháp:

Thay vì khai báo int a; bạn đã khai báo nhầm nó là in a;, và trình biên dịch sẽ báo lỗi.

Ví dụ về lỗi ngữ nghĩa: Bạn đã khai báo một biến. int a; và sau một số dòng mã, bạn lại khai báo một số nguyên là int a;. Tất cả các lỗi này đều được đánh dấu khi bạn biên dịch mã.

Ví dụ về lỗi thời gian chạy

Lỗi thời gian chạy được gọi là lỗi Ngoại lệNgoại lệ là bất kỳ sự kiện nào làm gián đoạn luồng thực thi bình thường của chương trình. Ví dụ về ngoại lệ bao gồm ngoại lệ số học, ngoại lệ con trỏ null, ngoại lệ chia cho 0 và nhiều ngoại lệ khác. Ngoại lệ trong Java Đó là những điều kiện thường nằm ngoài tầm kiểm soát trực tiếp của nhà phát triển.

Nhấp chuột đây nếu video không thể truy cập được

Tại sao chúng ta cần xử lý ngoại lệ?

Giả sử bạn đã lập trình một chương trình để truy cập máy chủ. Mọi thứ hoạt động tốt trong quá trình phát triển.ping mã nguồn trong môi trường cục bộ với các điều kiện được kiểm soát.

Java Xử lý ngoại lệ

Trong quá trình vận hành thực tế, máy chủ có thể bị lỗi. Khi chương trình của bạn cố gắng truy cập vào máy chủ, một ngoại lệ sẽ được ném ra, và nếu không được xử lý đúng cách, chương trình sẽ chấm dứt đột ngột.

Java Xử lý ngoại lệ

Cách xử lý ngoại lệ trong Java

Cho đến nay, chúng ta đã thấy rằng ngoại lệ thường nằm ngoài tầm kiểm soát của nhà phát triển. Tuy nhiên, đổ lỗi cho lỗi mã nguồn là do các vấn đề môi trường không phải là giải pháp thực sự. Bạn cần lập trình mạnh mẽ để xử lý các tình huống ngoại lệ. Mã như vậy được gọi là mã xử lý ngoại lệ. Trình xử lý ngoại lệ.

Trong ví dụ của chúng ta, việc xử lý ngoại lệ tốt có nghĩa là khi máy chủ chính gặp sự cố, chương trình sẽ tự động kết nối với máy chủ dự phòng.

Java Xử lý ngoại lệ

Để thực hiện điều này, bạn có thể viết mã để kết nối với máy chủ bằng cách sử dụng các điều kiện if và else truyền thống. Bạn sẽ kiểm tra xem máy chủ có bị lỗi hay không, và nếu có, bạn sẽ viết mã để kết nối với máy chủ dự phòng. Cách tổ chức mã bằng các nhánh “if” và “else” như vậy không hiệu quả khi mã của bạn có nhiều kết nối. Java trường hợp ngoại lệ giải quyết.

class connect{
	if(Server Up){
	 // code to connect to server
	}
	else{
	 // code to connect to BACKUP server
	}
}

Khối Try Catch trong Java

Java Cung cấp cơ chế xử lý ngoại lệ tích hợp, tách biệt logic thông thường khỏi logic phục hồi lỗi.

  1. Mã bình thường đi vào một DEMO khối.
  2. Mã xử lý ngoại lệ đi vào NẮM LẤY khối.

Hãy thử bắt khối

Trong ví dụ này, khối TRY sẽ chứa mã để kết nối với máy chủ. Khối CATCH sẽ chứa mã để kết nối với máy chủ dự phòng. Nếu máy chủ đang hoạt động, mã trong khối CATCH sẽ bị bỏ qua. Nếu máy chủ bị lỗi, một ngoại lệ sẽ được ném ra và mã trong khối CATCH sẽ được thực thi.

Hãy thử bắt khối

Vậy, đây là cách xử lý ngoại lệ trong Java.

Cú pháp sử dụng try và catch

try{
    statement(s)
}
catch (exceptiontype name){
	statement(s)
}

Ví dụ về khối Try Catch

Bước 1) Sao chép đoạn mã sau vào trình soạn thảo.

class JavaException {
   public static void main(String args[]){
      int d = 0;
      int n = 20;
      int fraction = n/d;
     System.out.println("End Of Main");
   }
}

Bước 2) Lưu tập tin và biên dịch mã. Chạy chương trình bằng lệnh `java`. JavaNgoại lệ.

Bước 3) Lỗi ngoại lệ số học, chia cho 0, được hiển thị ở dòng 5, và dòng 6 không bao giờ được thực thi.

Bước 4) Bây giờ chúng ta hãy xem cách try và catch giúp chúng ta xử lý ngoại lệ này. Chúng ta sẽ đặt dòng mã gây ra ngoại lệ vào trong khối try và catch. thử khối, theo sau là một bắt khối. Sao chép mã sau vào trình soạn thảo.

class JavaException {
 public static void main(String args[]) {
  int d = 0;
  int n = 20;
  try {
   int fraction = n / d;
   System.out.println("This line will not be Executed");
  } catch (ArithmeticException e) {
   System.out.println("In the catch Block due to Exception = " + e);
  }
  System.out.println("End Of Main");
 }
}

Bước 5) Lưu, biên dịch và chạy mã. Bạn sẽ nhận được kết quả như sau.

Hãy thử bắt khối

Như bạn thấy, ngoại lệ đã được xử lý và dòng mã cuối cùng cũng được thực thi. Ngoài ra, lưu ý rằng dòng 7 sẽ không được thực thi vì ngay khi một ngoại lệ được nâng lên, luồng điều khiển sẽ chuyển sang khối bắt.

Lưu ý: Đối tượng ArithmeticException “e” mang thông tin về ngoại lệ đã xảy ra, điều này có thể hữu ích khi thực hiện các hành động khắc phục.

Java Phân cấp lớp ngoại lệ

Sau khi một câu lệnh catch được thực thi, các câu lệnh khác sẽ bị bỏ qua và quá trình thực thi tiếp tục sau khối try và catch. Các khối catch lồng nhau phải tuân theo thứ tự ưu tiên xử lý ngoại lệ từ lớp con cụ thể nhất đến lớp cha tổng quát nhất.

Java Hệ thống phân cấp ngoại lệ

  • Tất cả các lớp ngoại lệ trong Java Mở rộng lớp Throwable. Lớp Throwable có hai lớp con là Error và Exception.
  • Lớp Error định nghĩa các ngoại lệ hoặc sự cố không mong đợi xảy ra trong điều kiện bình thường của chương trình, ví dụ: lỗi bộ nhớ, lỗi phần cứng hoặc lỗi JVM.
  • Lớp Exception đại diện cho các ngoại lệ mà chương trình của bạn có thể xử lý, và chương trình của bạn có thể phục hồi từ các ngoại lệ này bằng cách sử dụng các khối try và catch.
  • RuntimeException là một lớp con của lớp Exception. Các ngoại lệ thuộc loại này đại diện cho các ngoại lệ không được kiểm tra, xảy ra trong quá trình thực thi và không thể phát hiện được trong quá trình biên dịch. Ví dụ điển hình bao gồm ngoại lệ chia cho 0 và ngoại lệ con trỏ null.
  • Lỗi IOException phát sinh trong quá trình nhập và xuất dữ liệu.
  • InterruptedException in Java Được tạo ra trong quá trình hoạt động đa luồng khi một luồng bị gi gián đoạn.

Ví dụ: Lồng nhau các khối try và catch

Bước 1) Sao chép đoạn mã sau vào trình soạn thảo.

class JavaException {
 public static void main(String args[]) {
  try {
   int d = 1;
   int n = 20;
   int fraction = n / d;
   int g[] = {
    1
   };
   g[20] = 100;
  }
  /*catch(Exception e){
  	System.out.println("In the catch block due to Exception = "+e);
  }*/
  catch (ArithmeticException e) {
   System.out.println("In the catch block due to Exception = " + e);
  } catch (ArrayIndexOutOfBoundsException e) {
   System.out.println("In the catch block due to Exception = " + e);
  }
  System.out.println("End Of Main");
 }
}

Bước 2) Lưu tập tin và biên dịch mã. Chạy chương trình bằng lệnh sau: Java JavaNgoại lệ.

Bước 3) Lỗi ArrayIndexOutOfBoundsException xảy ra. Hãy thay đổi giá trị của biến int d thành 0. Lưu, biên dịch và chạy mã.

Bước 4) Phải tạo ra một ngoại lệ ArithmeticException.

Bước 5) Bỏ dấu chú thích ở dòng 10 đến dòng 12. Lưu, biên dịch và chạy mã.

Bước 6) Lỗi biên dịch? Điều này là do Exception là lớp cơ sở của ArithmeticException. Bất kỳ ngoại lệ nào được ArithmeticException ném ra cũng có thể được xử lý bởi lớp Exception. Vì vậy, khối catch của ArithmeticException sẽ không bao giờ có cơ hội được thực thi, điều này làm cho nó trở nên dư thừa. Do đó dẫn đến lỗi biên dịch.

Java Cuối cùng chặn

Khối cuối cùng là được thực thi bất kể ngoại lệ được nêu ra trong khối thử. Nó là không bắt buộc Để sử dụng với khối try. Khối finally là nơi thích hợp để giải phóng các tài nguyên như kết nối cơ sở dữ liệu, tệp hoặc socket mạng.

 try {
  statement(s)
 } catch (ExceptiontType name) {

  statement(s)

 } finally {

  statement(s)

 }

Nếu một ngoại lệ được ném ra trong khối try, khối finally sẽ được thực thi sau khi khối catch hoàn tất.

Ví dụ về khối finally

Bước 1) Sao chép đoạn mã sau vào trình soạn thảo.

class JavaException {
   public static void main(String args[]){
    try{
       int d = 0;
       int n =20;
       int fraction = n/d;
    }
  catch(ArithmeticException e){
    System.out.println("In the catch block due to Exception = "+e);
  }
  finally{
	System.out.println("Inside the finally block");
  }
}
}

Bước 2) Lưu, biên dịch và chạy mã.

Bước 3) Kết quả mong đợi: Khối finally được thực thi ngay cả khi có ngoại lệ xảy ra.

Bước 4) Thay đổi giá trị của biến d thành 1. Lưu, biên dịch và chạy mã, sau đó quan sát kết quả.

Các phương pháp hay nhất cho Java Xử lý ngoại lệ

Tuân thủ một vài quy tắc đã được chứng minh sẽ giúp bạn giữ gìn sức khỏe. Java Mã nguồn bền vững, dễ đọc và dễ gỡ lỗi:

  • Hãy bắt ngoại lệ cụ thể nhất trước, sau đó mới đến các ngoại lệ tổng quát hơn, để bảo toàn tính toàn vẹn của hệ thống phân cấp ngoại lệ.
  • Tránh sử dụng các khối catch rỗng. Ít nhất, hãy ghi lại ngoại lệ để không bao giờ mất đi nguyên nhân gốc rễ.
  • Sử dụng khối finally hoặc try with resources để giải phóng các tập tin, socket và kết nối cơ sở dữ liệu.
  • Chỉ ném các ngoại lệ được kiểm tra khi bên gọi có thể khắc phục được sự cố một cách hợp lý, và sử dụng các ngoại lệ không được kiểm tra cho các lỗi lập trình.
  • Gói các ngoại lệ cấp thấp trong một ngoại lệ nghiệp vụ có ý nghĩa để duy trì tính nhất quán của API.tracSạch sẽ.
  • Không bao giờ được âm thầm bỏ qua ngoại lệ InterruptedException trong mã đa luồng, thay vào đó hãy khôi phục cờ ngắt.

Câu Hỏi Thường Gặp

Các ngoại lệ được kiểm tra (checked exceptions) được xác minh tại thời điểm biên dịch và phải được khai báo hoặc bắt giữ, ví dụ như IOException. Các ngoại lệ không được kiểm tra (unchecked exceptions) kế thừa từ RuntimeException, xảy ra trong thời gian chạy và không yêu cầu xử lý bắt buộc, ví dụ như NullPointerException hoặc ArithmeticException.

Khối finally luôn chạy sau các khối try và catch, bất kể có xảy ra ngoại lệ hay không. Đây là nơi an toàn nhất để giải phóng các tài nguyên như file handle, kết nối cơ sở dữ liệu hoặc socket, đảm bảo kết thúc hoạt động một cách sạch sẽ.

Từ khóa `throw` được sử dụng bên trong một phương thức để thực sự tạo ra một đối tượng ngoại lệ, trong khi `throws` được sử dụng trong chữ ký phương thức để khai báo rằng phương thức đó có thể chuyển một số ngoại lệ đã được kiểm tra nhất định cho người gọi để xử lý.

Đúng vậy. Khối try có thể được theo sau bởi khối finally mà không cần khối catch. Mẫu này được sử dụng khi nhà phát triển muốn đảm bảo mã dọn dẹp được thực thi ngay cả khi ngoại lệ được truyền đến người gọi.

Đúng vậy. Các công cụ quan sát được hỗ trợ bởi AI phân tích hệ thống. tracChúng sử dụng các thông tin như nhật ký, đường dẫn mã để dự đoán nơi các ngoại lệ thời gian chạy có khả năng xảy ra. Chúng đề xuất các kiểm tra phòng ngừa, khuyến nghị vị trí bắt ngoại lệ và làm nổi bật các bất thường.ping Các nhóm ngăn chặn sự cố trước khi chúng xảy ra trong môi trường sản xuất.

Trợ lý AI phân tích ngăn xếp tracChúng phân tích lỗi, đối chiếu với mã nguồn và đề xuất các nguyên nhân gốc rễ có thể xảy ra cùng với các giải pháp khắc phục. Chúng tạo ra các mẫu try-catch, đề xuất cải tiến việc ghi nhật ký và thậm chí viết lại các phương thức bị lỗi, giúp giảm đáng kể thời gian các nhà phát triển dành cho việc chẩn đoán. Java các trường hợp ngoại lệ.

Tóm tắt bài viết này với: