JavaRush /Blog Java /Random-VI /Nghỉ giải lao #220. Cách khắc phục ngoại lệ trong Java - ...

Nghỉ giải lao #220. Cách khắc phục ngoại lệ trong Java - Hướng dẫn chi tiết

Xuất bản trong nhóm
Nguồn: JavaTechOnline Hướng dẫn này sẽ giúp bạn tìm hiểu cách khắc phục các ngoại lệ phổ biến trong Java. Ngoài lý thuyết, bạn sẽ thấy các ví dụ về mã để khắc phục những vấn đề như vậy. Nghỉ giải lao #220.  Cách khắc phục ngoại lệ trong Java - Hướng dẫn chi tiết - 1Cũng như các ngôn ngữ lập trình khác, nhà phát triển Java có thể gặp lỗi hoặc ngoại lệ khi viết mã. Các trường hợp ngoại lệ cần được xem xét nghiêm túc vì sự xuất hiện của chúng sẽ chiếm thời gian làm việc. Tuy nhiên, với một chút kiến ​​thức, bạn có thể tăng tốc độ giải quyết hầu hết các vấn đề này. Vì vậy, hãy cùng tìm hiểu cách khắc phục các ngoại lệ phổ biến trong Java.

Hướng dẫn chung để tránh ngoại lệ trong Java

Để tránh đưa ra bất kỳ ngoại lệ nào trong Java, điều quan trọng là phải hiểu và tuân theo các nguyên tắc mã hóa:
  1. Luôn xác thực dữ liệu đầu vào của người dùng trước khi sử dụng nó trong mã của bạn.
  2. Sử dụng try-catch , Throws , Throw Block , tùy thuộc vào điều gì phù hợp cho một tình huống cụ thể.
  3. Đừng bỏ qua các thông báo trong mã về quá trình xử lý và lỗi. Điều này sẽ giúp xác định và khắc phục vấn đề.
  4. Hãy chắc chắn ghi lại các ngoại lệ cho mục đích gỡ lỗi. Bạn có thể sử dụng thông báo nhật ký để giúp xác định vấn đề.
  5. Thực hiện theo các phương pháp mã hóa tốt nhất để tránh trường hợp ngoại lệ và kiểm tra mã của bạn một cách kỹ lưỡng.
  6. Cập nhật các phần phụ thuộc API của bạn để đảm bảo bạn đang sử dụng các phiên bản thư viện và khung mới nhất và ổn định nhất.
  7. Sử dụng các công cụ và khung kiểm tra cần thiết để xác định các vấn đề tiềm ẩn trong mã của bạn trước khi chúng đưa ra các ngoại lệ.
  8. Theo dõi hiệu suất và nhật ký của ứng dụng để nhanh chóng xác định và giải quyết mọi vấn đề.
  9. Luôn cập nhật các phương pháp bảo mật tốt nhất để đảm bảo mã của bạn được an toàn và được bảo vệ khỏi mọi cuộc tấn công tiềm ẩn.
  10. Hãy ghi lại mã của bạn và các ngoại lệ một cách kỹ lưỡng để giúp các nhà phát triển khác hiểu và duy trì dễ dàng hơn.

Danh sách các ngoại lệ phổ biến nhất trong Java

Java có một danh sách ngoại lệ khá dài. Chúng ta hãy xem xét một số phổ biến nhất:

NullPointerNgoại lệ

NullPointerException là một loại ngoại lệ RuntimeException . Nó xảy ra khi chúng ta cố gắng sử dụng một biến tham chiếu có giá trị null. Điều này có nghĩa là nó trỏ đến một đối tượng hoặc biến có giá trị là null . Lỗi như vậy có thể xảy ra khi chúng ta cố gắng gọi một phương thức hoặc truy cập vào trường của một đối tượng chưa được khởi tạo hoặc khi chúng ta chuyển null làm tham số cho một phương thức không xử lý nó. Để tránh ném ngoại lệ NullPointerException , bạn có thể kiểm tra xem biến tham chiếu có rỗng hay không bằng cách sử dụng toán tử == . Nếu đúng như vậy thì trường hợp null cần được xử lý chính xác. Ngoài ra, chúng ta có thể khởi tạo các biến của mình thành giá trị mặc định (nếu có thể) để đảm bảo rằng chúng ta không bao giờ gặp phải tham chiếu null. Một cách khác để tránh NullPointerException là sử dụng lớp Tùy chọn . Trong Java, Tùy chọn là một đối tượng chứa có thể chứa hoặc không chứa giá trị khác null. Nó được sử dụng để thể hiện sự hiện diện hay vắng mặt của một giá trị, tương tự như cách sử dụng giá trị null để thể hiện sự vắng mặt của một giá trị. Nếu một lập trình viên cố gắng truy cập giá trị trống của một đối tượng Tùy chọn , chương trình sẽ không ném ra Ngoại lệ NullPointerException mà thay vào đó sẽ trả về một đối tượng Tùy chọn trống . Nói cách khác, Tùy chọn buộc người lập trình phải xử lý trường hợp thiếu giá trị, điều này giúp tránh NullPointerException .

IndexOutOfBoundsNgoại lệ

IndexOutOfBoundsException là một ngoại lệ thời gian chạy được đưa ra khi chỉ mục được sử dụng để truy cập một mảng hoặc bộ sưu tập có giá trị âm hoặc lớn hơn hoặc bằng kích thước của mảng hoặc bộ sưu tập. Để ngăn ngoại lệ này xảy ra, chúng ta phải đảm bảo rằng chỉ mục được sử dụng để truy cập vào mảng hoặc bộ sưu tập nằm trong giới hạn của nó, nghĩa là chỉ mục đó phải lớn hơn hoặc bằng 0 và nhỏ hơn kích thước của mảng hoặc bộ sưu tập.

ArrayIndexOutOfBoundsNgoại lệ

ArrayIndexOutOfBoundsException là một loại IndexOutOfBoundsException được ném ra khi cố gắng truy cập vào một mảng có chỉ mục không hợp lệ. Trong Java, các chỉ mục mảng bắt đầu từ 0 và kết thúc ở length()-1 , trong đó length() là số phần tử trong mảng. Nếu bạn cố gắng truy cập một phần tử tại một chỉ mục nằm ngoài phạm vi này, Java sẽ đưa ra một ngoại lệ ArrayIndexOutOfBoundsException . Khi gặp ArrayIndexOutOfBoundsException , bạn nên xem lại mã của mình để đảm bảo rằng bạn đang sử dụng đúng chỉ mục khi truy cập các phần tử trong mảng.

StringIndexOutOfBoundsNgoại lệ

StringIndexOutOfBoundsException là loại IndexOutOfBoundsException được ném ra khi cố gắng truy cập một ký tự trong chuỗi có chỉ mục không hợp lệ. Giống như ArrayIndexOutOfBoundsException trước đó , hãy nhớ rằng trong Java, chỉ mục của một chuỗi bắt đầu từ 0 và kết thúc ở length()-1 , trong đó length() là số ký tự trong chuỗi. Nếu bạn cố gắng truy cập một ký tự ở chỉ mục ngoài phạm vi này, bạn có thể gặp phải ngoại lệ StringIndexOutOfBoundsException . Nếu gặp StringIndexOutOfBoundsException , bạn nên xem lại mã của mình để đảm bảo bạn đang sử dụng đúng chỉ mục khi truy cập các ký tự trong chuỗi.

ClassCastException

Ngoại lệ này xảy ra khi chúng ta cố gắng truyền một đối tượng sang một kiểu không tương thích với kiểu thực tế của nó. Để giải quyết vấn đề như thế này, điều quan trọng là phải đảm bảo rằng chương trình Java của bạn chỉ cố gắng chuyển các đối tượng sang các lớp mà chúng là thể hiện. Bạn có thể kiểm tra loại đối tượng bằng cách sử dụng toán tử instanceof trước khi áp dụng kiểu ép kiểu.

Ngoại lệ Đối số bất hợp pháp

IllegalArgumentException là một loại RuntimeException được ném ra khi một phương thức được gọi với đối số không hợp lệ hoặc không phù hợp. Nói cách khác, lỗi này có thể xảy ra khi một phương thức được gọi với đối số nằm ngoài phạm vi dự kiến ​​hoặc không có định dạng hoặc cấu trúc dự kiến. Ví dụ: một phương thức yêu cầu số dương làm đối số và chúng tôi cung cấp số âm, đây là số đầu vào không hợp lệ. Nếu gặp phải IllegalArgumentException , bạn nên kiểm tra mã của mình để đảm bảo rằng bạn đang gọi các phương thức có đối số hợp lệ và phù hợp.

Ngoại lệ nhà nước bất hợp pháp

IllegalStateException là một loại RuntimeException được ném ra khi một đối tượng ở trạng thái không phù hợp cho thao tác đang được thực hiện. Điều này có thể xảy ra nếu một phương thức được gọi trên một đối tượng không ở trạng thái mong đợi. Ví dụ: nếu chúng ta tạo một đối tượng kết nối cơ sở dữ liệu rồi đóng nó lại. Sau đó, nếu chúng ta cố gắng tạo một đối tượng Statement trong một kết nối đóng, nó sẽ ném ra một IllegalStateException vì phương thức createStatement() yêu cầu một kết nối mở. Nếu gặp phải IllegalStateException , bạn nên xem lại mã của mình để đảm bảo rằng bạn đang gọi các phương thức trên các đối tượng ở trạng thái thích hợp.

Ngoại lệ hoạt động không được hỗ trợ

UnsupportedOperationException là loại RuntimeException được ném ra khi cố gắng thực hiện một thao tác không được hỗ trợ trên một đối tượng. Lỗi này có thể xảy ra khi chúng ta gọi một phương thức không được đối tượng triển khai hoặc không được đối tượng hỗ trợ. Để ngăn chặn việc ném ngoại lệ, chúng ta không nên gọi các thao tác không được hỗ trợ trên các đối tượng. Chúng ta cần xem lại mã của mình để đảm bảo rằng chúng ta đang gọi các phương thức trên các đối tượng hỗ trợ thao tác.

Số họcNgoại lệ

ArithmeticException là một loại RuntimeException được ném ra khi một phép toán số học tạo ra kết quả không hợp lệ. Ngoại lệ này có thể xảy ra khi chúng ta cố gắng thực hiện một phép tính số học với một đối số không hợp lệ hoặc không hợp lệ. Ví dụ: khi cố gắng chia cho số 0. Để giải quyết vấn đề này, chúng ta có thể thực hiện xác thực đầu vào và đảm bảo rằng các đối số đáp ứng các điều kiện bắt buộc trước khi thực hiện phép toán số học.

Ngoại lệ an ninh

SecurityException là một loại RuntimeException được ném ra khi xảy ra vi phạm bảo mật trong quá trình thực thi chương trình. Lỗi này có thể xảy ra khi một chương trình cố gắng thực hiện một thao tác không được chính sách bảo mật cho phép. Để giải quyết vấn đề, chúng tôi phải đảm bảo rằng chúng tôi có quyền truy cập vào tài nguyên và thực hiện các hoạt động mà chúng tôi có quyền cụ thể.

SốĐịnh dạngNgoại lệ

NumberFormatException là một loại RuntimeException được ném ra khi một phương thức được gọi để chuyển đổi một chuỗi sang định dạng số, nhưng chuỗi đó không có định dạng thích hợp. Để giải quyết vấn đề này, trước tiên chúng ta phải xác thực dữ liệu đầu vào của người dùng trước khi thử chuyển đổi nó. Ngoài ra, hãy kiểm tra mã của bạn để đảm bảo rằng bạn đang cố gắng chuyển đổi các chuỗi được định dạng phù hợp với loại số đích.

Ngoại lệ bị gián đoạn

InterruptedException là một ngoại lệ được kiểm tra và được ném ra nếu một luồng đang chờ, đang ngủ hoặc bị chặn đối với một số sự kiện và sự kiện đó bị gián đoạn bởi một luồng khác. Lỗi có thể xảy ra khi một luồng đang chờ đầu vào, giải phóng khóa hoặc hoàn thành một số thao tác khác và một luồng khác làm gián đoạn luồng đang chờ. Để giải quyết vấn đề này, bạn có thể nắm bắt Ngoại lệ InterruptedException và phản hồi bằng cách dọn sạch tài nguyên, dừng chuỗi hoặc thực hiện hành động thích hợp khác. Nếu gặp phải Ngoại lệ InterruptedException , bạn nên kiểm tra mã của mình để đảm bảo rằng bạn đang xử lý chính xác các gián đoạn luồng.

Tệp không tìm thấy ngoại lệ

FileNotFoundException là một ngoại lệ được kiểm tra được đưa ra khi một chương trình cố gắng truy cập một tệp không tồn tại hoặc không thể tìm thấy ở vị trí đã chỉ định. Nó có thể xuất hiện nếu tệp bị sai chính tả, bị di chuyển hoặc bị xóa hoặc ngay cả khi chương trình không có quyền cần thiết để truy cập vào tệp. Để khắc phục lỗi, bạn có thể thực hiện xác thực đầu vào để đảm bảo rằng đường dẫn tệp chính xác và chương trình có các quyền cần thiết để truy cập tệp.

IOException

IOException là một ngoại lệ được kiểm tra trong Java, biểu thị lỗi gặp phải khi thực hiện các thao tác đầu vào hoặc đầu ra, chẳng hạn như đọc hoặc ghi vào tệp hoặc ổ cắm mạng. Điều này có thể xảy ra vì một số lý do, chẳng hạn như tệp được chỉ định bị thiếu hoặc không thể truy cập được, lỗi mạng hoặc không đủ quyền. Để khắc phục sự cố, bạn cần thực hiện một số hành động như kiểm tra thông báo lỗi, xử lý ngoại lệ bằng cách sử dụng try-catch , đóng tài nguyên, kiểm tra quyền truy cập tệp, v.v.

NoSuchMethodNgoại lệ

NoSuchMethodException là một ngoại lệ được đưa ra trong thời gian chạy khi chúng ta cố gắng gọi một phương thức không tồn tại trong lớp. Ngoại lệ này thường xảy ra nếu chúng ta gọi một phương thức bằng Class.getMethod() hoặc Class.getDeclaredMethod() và không tìm thấy tên phương thức đã chỉ định trong lớp hoặc giao diện. Một ngoại lệ cũng có thể xảy ra khi chúng ta cố gắng gọi một phương thức bằng lớp java.lang.reflect.Method và tên phương thức đã chỉ định không tồn tại trong đối tượng. Để tránh ngoại lệ này, hãy đảm bảo gọi một phương thức hợp lệ với chữ ký phương thức và thông số truy cập chính xác.

NoSuchFieldException

NoSuchFieldException là một ngoại lệ thời gian chạy xảy ra khi chúng ta cố gắng truy cập vào một trường không có trong lớp. Ngoại lệ này thường xảy ra khi chúng ta gọi một phương thức bằng Class.getField() hoặc Class.getDeclaredField() và không tìm thấy tên trường đã chỉ định trong lớp hoặc giao diện. Ngoài ra, nó cũng có thể được gọi nếu chúng ta đang cố truy cập một trường bằng lớp java.lang.reflect.Field và tên trường được chỉ định không tồn tại trong đối tượng. Để tránh ngoại lệ này, hãy đảm bảo bạn đang truy cập vào một trường hợp lệ với tên và công cụ sửa đổi quyền truy cập chính xác. Nếu bạn đang truy cập vào một trường riêng tư, hãy đảm bảo sử dụng phương thức getDeclaredField() thay vì phương thức getField() .

Truy cập bất hợp phápNgoại lệ

IllegalAccessException là một ngoại lệ trong thời gian chạy xảy ra khi chúng tôi cố gắng truy cập vào một trường hoặc phương thức trong một lớp nhưng chúng tôi không có quyền truy cập cần thiết. Ngoại lệ này thường xuất hiện khi chúng ta cố gắng truy cập vào một trường hoặc phương thức riêng tư từ bên ngoài một lớp hoặc khi chúng ta cố gắng truy cập vào một trường hoặc phương thức được bảo vệ từ một lớp không phải là lớp con của lớp gốc. Nó cũng có thể được gọi khi cố gắng truy cập vào một trường hoặc phương thức đã được lớp java.lang.reflect.AccessibleObject đánh dấu là không khả dụng . Để tránh sự cố này, hãy đảm bảo bạn có các quyền cần thiết đối với trường hoặc phương thức mà bạn đang cố truy cập. Nếu trường hoặc phương thức này là riêng tư, bạn có thể cần sử dụng sự phản chiếu và đặt AccessObject thành true (để truy cập nó). Tuy nhiên, hãy cẩn thận khi sử dụng sự phản chiếu để truy cập vào các trường hoặc phương thức riêng tư, vì nó có thể phá vỡ tính đóng gói và làm tổn hại đến tính toàn vẹn của lớp.

Xác minhLỗi

VerifyError là lỗi thời gian chạy và là một lớp con của LinkageError . Nó xảy ra khi Máy ảo Java (JVM) gặp một tệp lớp vi phạm các quy tắc xác thực nhất định. Khi một lớp Java được biên dịch, trình biên dịch sẽ kiểm tra xem mã byte có tuân theo các quy tắc và hạn chế nhất định hay không, chẳng hạn như an toàn kiểu và sử dụng hợp lý ngăn xếp và các biến cục bộ. Nếu một tệp lớp vi phạm các quy tắc này, JVM sẽ đưa ra VerifyError khi tải và kiểm tra lớp trong thời gian chạy. Để tránh VerifyError , hãy đảm bảo mã của bạn tuân theo đúng cú pháp và ngữ nghĩa của ngôn ngữ Java. Nếu gặp phải VerifyError , bạn nên kiểm tra mã của mình để đảm bảo rằng nó hợp lệ và không có vi phạm quy tắc xác minh mã byte Java.

Lỗi bộ nhớ

OutOfMemoryError là một lớp con của Error , một loại Throwable gây ra các vấn đề nghiêm trọng không thể giải quyết được trong thời gian chạy. Mặc dù Java 8 bao gồm một số cải tiến trong việc thu thập rác và quản lý bộ nhớ, bạn vẫn có thể gặp phải OutOfMemoryError nếu ứng dụng của bạn đang sử dụng quá nhiều bộ nhớ hoặc quản lý việc sử dụng bộ nhớ không chính xác. Để tránh OutOfMemoryError , bạn cần quản lý đúng cách việc sử dụng bộ nhớ trong ứng dụng Java của mình. Điều này liên quan đến việc sử dụng các cấu trúc dữ liệu và thuật toán sử dụng bộ nhớ một cách hiệu quả, tránh việc tạo đối tượng không cần thiết và xóa các đối tượng một cách hợp lý khi chúng không còn cần thiết nữa. Ngoài ra, bạn có thể tăng kích thước vùng heap tối đa cho JVM bằng cách sử dụng cờ -Xmx khi chạy chương trình Java của mình.

StackOverflowLỗi

StackOverflowError là một loại lỗi xảy ra khi kích thước ngăn xếp mà chương trình yêu cầu vượt quá dung lượng bộ nhớ được phân bổ cho nó. Nó có thể xảy ra khi một chương trình gọi quá nhiều phương thức lồng nhau hoặc khi một phương thức gọi chính nó một cách đệ quy quá nhiều lần, dẫn đến một vòng lặp vô hạn. Máy ảo Java (JVM) phân bổ một lượng bộ nhớ cố định cho ngăn xếp thực thi, được sử dụng để theo dõi các lệnh gọi phương thức và các biến cục bộ. Khi ngăn xếp tràn, JVM sẽ ném ra StackOverflowError . Để tránh StackOverflowError , điều quan trọng là phải đảm bảo rằng chương trình Java của bạn sử dụng đầy đủ các lệnh gọi phương thức và đệ quy. Nếu gặp StackOverflowError , bạn có thể thử tăng kích thước ngăn xếp bằng cách sử dụng cờ -Xss khi chạy chương trình Java của mình.

Đưa ra những mục tiêu ngoại lệ

InvocationTargetException là một ngoại lệ được kiểm tra do cơ chế phản chiếu Java đưa ra. Nó là một phần của gói java.lang.reflect.InvocationTargetException và được sử dụng để chỉ ra rằng một ngoại lệ đã xảy ra trong quá trình gọi phương thức hoặc hàm tạo. Khi một phương thức hoặc hàm tạo được gọi bằng cơ chế phản chiếu Java, phương thức gọi() của lớp java.lang.reflect.Method hoặc java.lang.reflect.Constructor được gọi . Nếu phương thức hoặc hàm tạo được gọi ném ra một ngoại lệ, thì phương thứcgọi() sẽ bắt nó và gói nó trong một InvocationTargetException . Ngoại lệ này sau đó được chuyển tới người gọi phương thức gọi() . Để khắc phục InvocationTargetException , chúng ta cần nắm bắt nó, lấy ngoại lệ nguyên nhân gốc bằng cách sử dụng phương thức getCause() và xử lý ngoại lệ nguyên nhân gốc tương ứng. Lưu ý rằng nguyên nhân cốt lõi có thể là ngoại lệ được kiểm tra hoặc ngoại lệ thời gian chạy, vì vậy hãy đảm bảo xử lý chính xác.

Cách khắc phục các ngoại lệ phổ biến nhất trong Java

Cách khắc phục NullPointerException

Tình huống: Bạn có một phương thức truy cập một đối tượng có giá trị null .
String title= null;
System.out.println(title.length()); // Это вызовет NullPointerException
Giải pháp số 1: Kiểm tra xem đối tượng có rỗng hay không trước khi sử dụng.
if(title!= null) {
   System.out.println(title.length());
} else {
   System.out.println("title is null");
}
Giải pháp số 2: Sử dụng Tùy chọn để tránh NullPointerException .
Optional<String> optionalTitle = Optional.ofNullable(getTitle());
if (optionalTitle.isPresent()) {
   String title= optionalTitle.get();
   System.out.println("Title: " + title);
} else {
   System.out.println("Title is not available.");
}

Cách khắc phục ngoại lệ ArrayIndexOutOfBoundsException

Tình huống: Bạn đang cố truy cập một mảng ở một chỉ mục nằm ngoài giới hạn của nó.
int[] numbers = {4, 5, 6};
System.out.println(numbers[3]);   // Это вызовет ArrayIndexOutOfBoundsException
Giải pháp: Kiểm tra độ dài của mảng trước khi truy cập và đảm bảo bạn đang sử dụng các chỉ mục hợp lệ.
int[] numbers = {4, 5, 6};
if (numbers.length > 3) {
   System.out.println(numbers[3]);
} else {
   System.out.println("ArrayIndexOutOfBoundsException: Please use valid indexes of the Array");
}

Cách khắc phục ClassCastException

Tình huống: Bạn đang cố chuyển một đối tượng sang một loại không tương thích với loại thực tế của nó.
Object obj = "Java Exception";
Integer number = (Integer) obj; // Это вызовет ClassCastException
Giải pháp: Hãy đảm bảo rằng bạn chỉ chuyển các đối tượng sang loại mà chúng tương thích.
Object obj = "Java Exception";
if(obj instanceof Integer) {
   Integer number = (Integer) obj;
   System.out.println(number);
} else {
   System.out.println("Object cannot caste to Integer");
}

Cách khắc phục IllegalArgumentException

Tình huống: Bạn đã truyền một đối số không hợp lệ vào một phương thức.
public void printNumber(int number) {
   if(number <= 0) {
      throw new IllegalArgumentException("You cannot pass a negative number or zero");
   }
   System.out.println(number);
}

printNumber(-1); // Это вызовет IllegalArgumentException
Giải pháp: Hãy đảm bảo rằng bạn đang truyền các đối số hợp lệ cho các phương thức. Trong trường hợp này, hãy chuyển một số dương.
printNumber(1); //  Это успешно напечатает 1.

Cách khắc phục IllegalStateException

Tình huống: Đối tượng ở trạng thái không hợp lệ.
public class Bike {

   private Boolean isStarted;

   public void start() {
      if(isStarted) {
        throw new IllegalStateException("Bike is already started");
      }
      isStarted = true;
      System.out.println("Bike started");
   }
}

Bike bike= new Bike();
bike.start();
bike.start(); // Это вызовет IllegalStateException потому что bike is already started
Giải pháp: Đảm bảo bạn duy trì trạng thái đối tượng chính xác.
Bike bike= new Bike();
bike.start();

Cách khắc phục ngoại lệ UnsupportedOperationException

Tình huống: Bạn sử dụng thao tác không được đối tượng hỗ trợ. Một ví dụ phổ biến là khi bạn sử dụng thao tác Remove() trên một bộ sưu tập bất biến, bạn có thể sẽ thấy ngoại lệ UnsupportedOperationException .
List<String> list = Arrays.asList("Java", "Angular", "Spring");
list.add("Python"); // Это вызовет UnsupportedOperationException
Vì phương thức Arrays.asList() trả về một danh sách bất biến nên nó không hỗ trợ thêm hoặc xóa các phần tử. Giải pháp: Đảm bảo bạn chỉ gọi các thao tác được hỗ trợ trên các đối tượng.
List<String> list = new ArrayList<>(Arrays.asList("Java", "Angular" "Spring"));
list.add("Python");
System.out.println(list);

Cách khắc phục ArithmeticException

Tình huống #1: Bạn đang cố gắng thực hiện phép chia số nguyên tạo ra kết quả phân số.
int i = 10;
int j = 4;
int k = i/j; // Это вызовет исключение ArithmeticException: целочисленное деление будет дробным
Ở đây kết quả của phép chia là 2,5, là một giá trị phân số. Bởi vì các số nguyên không thể lưu trữ các giá trị phân số nên một ngoại lệ ArithmeticException sẽ được ném ra . Giải pháp: Để tránh ngoại lệ này, chúng ta có thể sử dụng loại dữ liệu hỗ trợ các giá trị phân số, chẳng hạn như double , để lưu trữ kết quả của phép chia. Đây là một ví dụ:
int i = 10;
int j = 4;
double k = (double) i/j;
Tình huống #2: Bạn cố chia cho 0 và bạn gặp ngoại lệ này. Đây là kịch bản phổ biến nhất.
int i = 4;
int j = 0;
int k = i/j; // Это вызовет исключение ArithmeticException: нельзя делить на ноль
Giải pháp: Xử lý phép chia cho 0 một cách chính xác. Ví dụ: mã bên dưới thể hiện quá trình xử lý chính xác.
int i = 4;
int j = 0;
if(j != 0) {
int k = i/j;
System.out.println(k);
} else {
System.out.println("ArithmeticException: Cannot divide by zero");
}

Cách khắc phục ngoại lệ IndexOutOfBoundsException

Tình huống: Bạn đang cố truy cập bộ sưu tập có chỉ mục nằm ngoài bộ sưu tập đó.
List<String> list = Arrays.asList("Apple", "Papaya", "Mango");
System.out.println(list.get(3)); // Это вызовет IndexOutOfBoundsException
Giải pháp: Kiểm tra kích thước của bộ sưu tập trước khi truy cập và đảm bảo bạn đang sử dụng các chỉ mục hợp lệ.
List<String> list = Arrays.asList("Apple", "Papaya", "Mango");
if (list.size() > 3) {
   System.out.println(list.get(3));
} else {
   System.out.println("You are using the Index which is out of bounds");
}

Cách khắc phục IOException

Tình huống: Thao tác đầu vào/đầu ra không thành công do không thể truy cập được tệp.
try {
   File inputFile = new FileReader("pqr.txt");
   BufferedReader reader = new BufferedReader(inputFile);
   String line = reader.readLine();
   System.out.println(line);
} catch (IOException e) {
   e.printStackTrace();
}
Giải pháp: Xử lý lỗi I/O và đảm bảo rằng tài nguyên được đóng chính xác.
File inputFile = new File("pqr.txt");

if (!inputFile.exists() || !inputFile.canRead()) {
 System.out.println("The input file is missing or not readable.");
 return;
}

try {
BufferedReader reader = new BufferedReader(inputFile);
 String line = reader.readLine();
 System.out.println(line);
  reader.close();
} catch (IOException e) {
 e.printStackTrace();
}
Lưu ý rằng để thay thế, chúng ta có thể sử dụng tính năng thử với tài nguyên được giới thiệu trong Java 7 để tự động đóng tài nguyên như hiển thị bên dưới. Chúng ta có thể khai báo một hoặc nhiều tài nguyên trong câu lệnh try và Java sẽ tự động đóng các tài nguyên ở cuối khối, bất kể khối đó hoàn thành bình thường hay có ngoại lệ được đưa ra.
try (BufferedReader reader = new BufferedReader(new FileReader("pqr.txt"))) {
....
} catch {
....
}

Cách khắc phục FileNotFoundException

Tình huống: Không tìm thấy tệp ở vị trí đã chỉ định.
try {
     BufferedReader reader = new BufferedReader(new FileReader("abc.txt"));
     String line = reader.readLine();
     System.out.println(line);
     reader.close();
} catch (FileNotFoundException | IOException e) {
     System.out.println("An error has occurred while reading the file: " + e.getMessage());
}
Giải pháp: Đảm bảo tệp tồn tại và bạn có quyền thích hợp để truy cập tệp đó.
try {
    File file = new File("abc.txt");
    if(!file.exists()) {
    throw new FileNotFoundException("File not found at the specified location");
    }
    BufferedReader reader = new BufferedReader(new FileReader(file));
    String line = reader.readLine();
    System.out.println(line);
    reader.close();
} catch (IOException e) {
    e.printStackTrace();
}

Cách khắc phục NoSuchMethodException

Tình huống: Nếu bạn đang cố truy cập một phương thức không thể tìm thấy.
public class TestClass {
   public void sayHello() {
      System.out.println("Hello");
   }
}

TestClass obj = new TestClass();
Method method = obj.getClass().getMethod("printHello"); // Это вызовет NoSuchMethodException
Giải pháp: Xác minh rằng phương thức tồn tại và tên cũng như chữ ký của phương thức là chính xác.
public class TestClass {
   public void sayHello() {
      System.out.println("Hello");
   }
}

TestClass  obj = new TestClass();
try {
    Method method = obj.getClass().getMethod("sayHello");
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

Cách khắc phục ConcurrentModificationException

Tình huống: Một bộ sưu tập thay đổi trong khi nó đang được lặp lại.
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
for (String str : list) {
  list.remove(str);  // Это вызовет ConcurrentModificationException
}
Giải pháp: Sử dụng trình lặp để lặp lại một bộ sưu tập và sửa đổi nó bằng các phương thức lặp.
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String str = iterator.next();
    iterator.remove();
}
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION