Ngoại lệ so với Lỗi
Hành vi không mong muốn nhất định xảy ra khi chương trình đang chạy. Điều này có thể là do ngoại lệ hoặc lỗi. Ngoại lệ là các sự kiện, có thể làm xáo trộn dòng chương trình bình thường. Sai sót là điều kiện có thể được coi là không thể khôi phục được. Các ngoại lệ chủ yếu liên quan đến bản thân ứng dụng, trong khi các lỗi liên quan đến hệ thống mà chương trình đang chạy.
Ngoại lệ là gì?
Ngoại lệ là một sự kiện, có thể làm xáo trộn luồng chương trình bình thường. Ngoại lệ tên bắt nguồn từ "sự kiện đặc biệt". Ném một ngoại lệ là quá trình tạo một đối tượng ngoại lệ và chuyển giao nó cho hệ thống thời gian chạy. Đối tượng ngoại lệ được tạo bởi phương thức mà ngoại lệ xảy ra. Đối tượng ngoại lệ chứa thông tin hữu ích như kiểu và mô tả của ngoại lệ. Khi hệ thống thời gian chạy nhận được đối tượng ngoại lệ, nó sẽ cố gắng tìm ai đó để xử lý nó trong ngăn xếp cuộc gọi bằng cách duyệt nó theo thứ tự ngược lại (trong đó các phương thức được gọi). Ngăn xếp cuộc gọi là danh sách có thứ tự các phương thức, được gọi trước phương thức mà ngoại lệ xảy ra. Hệ thống thời gian chạy thành công nếu nó tìm thấy một phương thức có trình xử lý ngoại lệ. Trình xử lý ngoại lệ là một khối mã có thể chính thức xử lý ngoại lệ đã nói. Nếu hệ thống thời gian chạy tìm thấy một trình xử lý thích hợp (tức là kiểu ngoại lệ khớp với kiểu có thể được xử lý), nó sẽ chuyển đối tượng ngoại lệ cho trình xử lý. Điều này được gọi là bắt ngoại lệ. Tuy nhiên, nếu không thể xử lý ngoại lệ, chương trình sẽ chấm dứt. Trong Java, các ngoại lệ kế thừa từ lớp ‘Throwable.’ NullPointerException và ArrayIndexOutOfBoundsException là hai ngoại lệ phổ biến trong Java.
Lỗi là gì?
Lỗi là một điều kiện có thể được coi là không thể khôi phục được chẳng hạn như chương trình yêu cầu một lượng bộ nhớ lớn hơn những gì hiện có. Những lỗi này không thể được xử lý trong thời gian chạy. Nếu xảy ra lỗi, chương trình sẽ kết thúc. Trong Java, lỗi kế thừa từ lớp Throwable. Lỗi thường là những vấn đề nghiêm trọng mà lập trình viên (hoặc ứng dụng) không nên cố gắng bắt. Sai sót chỉ đơn giản là những điều kiện bất thường, không bao giờ được mong đợi xảy ra trong những trường hợp bình thường, và do đó không bao giờ có thể lường trước được. Ví dụ, OutOfMemoryError, StackOverflowError và ThreadDead là những lỗi như vậy. Các phương thức không bao giờ được có trình xử lý lỗi.
Sự khác biệt giữa Ngoại lệ và Lỗi là gì?
Cả lỗi và ngoại lệ đều xảy ra không mong muốn trong quá trình thực thi chương trình. Tuy nhiên, chúng có những điểm khác biệt chính. Lập trình viên có thể thấy trước các trường hợp ngoại lệ, trong khi một lỗi rất khó lường trước. Các trường hợp ngoại lệ có thể được chọn hoặc bỏ chọn. Nhưng lỗi luôn không được kiểm tra. Các ngoại lệ thường chỉ ra lỗi do lập trình viên gây ra. Tuy nhiên, lỗi xảy ra do lỗi hệ thống hoặc sử dụng tài nguyên không hợp lý. Do đó, các ngoại lệ nên được xử lý ở cấp ứng dụng, trong khi các lỗi cần được xử lý ở cấp hệ thống (chỉ khi có thể). Sau khi xử lý một ngoại lệ, bạn được đảm bảo quay lại luồng chương trình bình thường. Nhưng ngay cả khi bị bắt lỗi, lập trình viên có thể không biết cách xử lý ngay từ đầu. Không giống như xử lý lỗi truyền thống, các ngoại lệ cho phép tách mã xử lý lỗi khỏi mã thông thường.