Tôi đang cố gắng tìm hiểu thêm về Java cơ bản và các loại Ném khác nhau, ai đó có thể cho tôi biết sự khác biệt giữa Ngoại lệ và Lỗi không?
Tôi đang cố gắng tìm hiểu thêm về Java cơ bản và các loại Ném khác nhau, ai đó có thể cho tôi biết sự khác biệt giữa Ngoại lệ và Lỗi không?
Câu trả lời:
Lỗi không nên bị bắt hoặc xử lý (trừ trường hợp hiếm nhất). Ngoại lệ là bánh mì và bơ xử lý ngoại lệ. Các Javadoc giải thích nó cũng:
Lỗi là một lớp con của throwable chỉ ra các vấn đề nghiêm trọng mà một ứng dụng hợp lý không nên cố gắng nắm bắt. Hầu hết các lỗi như vậy là điều kiện bất thường.
Nhìn vào một vài trong số các lớp con của Error
, lấy một số nhận xét JavaDoc của chúng:
AnnotationFormatError
- Ném khi trình phân tích chú thích cố gắng đọc chú thích từ tệp lớp và xác định rằng chú thích không đúng.AssertionError
- Ném để chỉ ra rằng một khẳng định đã thất bại.LinkageError
- Các lớp con của LinkageError chỉ ra rằng một lớp có một số phụ thuộc vào một lớp khác; tuy nhiên, lớp sau đã thay đổi một cách không thể thay đổi sau khi biên dịch lớp cũ.VirtualMachineError
- Ném để chỉ ra rằng Máy ảo Java bị hỏng hoặc đã hết tài nguyên cần thiết để nó tiếp tục hoạt động. Thực sự có ba loại con quan trọng của Throwable
:
Error
- Một cái gì đó đủ nghiêm trọng đã sai, hầu hết các ứng dụng sẽ bị sập thay vì cố gắng xử lý sự cố,RuntimeException
) - Rất thường xảy ra lỗi lập trình như một NullPointerException
đối số bất hợp pháp. Các ứng dụng đôi khi có thể xử lý hoặc khôi phục từ Throwable
danh mục này - hoặc ít nhất là bắt nó theo run()
phương pháp của Thread , ghi nhật ký khiếu nại và tiếp tục chạy.FileNotFoundException
và TimeoutException
...Slide này hiển thị phân cấp ngoại lệ của Java bởi @ georgios-gousios giải thích chính xác sự khác biệt giữa Lỗi và Ngoại lệ trong Java.
Lỗi có xu hướng báo hiệu sự kết thúc của ứng dụng của bạn như bạn biết. Nó thường không thể được phục hồi từ và sẽ khiến VM của bạn thoát ra. Việc bắt chúng không nên được thực hiện ngoại trừ có thể đăng nhập hoặc hiển thị và thông báo phù hợp trước khi thoát.
Ví dụ: OutOfMemoryError - Bạn không thể làm gì nhiều vì chương trình của bạn không thể chạy được nữa.
Các ngoại lệ thường có thể phục hồi và ngay cả khi không, chúng thường chỉ có nghĩa là một hoạt động đã cố gắng thất bại, nhưng chương trình của bạn vẫn có thể tiếp tục.
Ví dụ: IllegalArgumentException - Truyền dữ liệu không hợp lệ cho một phương thức để cuộc gọi phương thức đó không thành công, nhưng nó không ảnh hưởng đến các hoạt động trong tương lai.
Đây là những ví dụ đơn giản và có rất nhiều thông tin khác chỉ riêng về Ngoại lệ.
Lỗi -
Error
s trong java là loại java.lang.Error
.Error
s xảy ra vào thời gian chạy. Họ sẽ không được biết đến trình biên dịch. Error
s chủ yếu là do môi trường mà ứng dụng đang chạy. java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Ngoại lệ -
Exception
s trong java là loại java.lang.Exception
.Exception
s bao gồm cả loại được kiểm tra cũng như loại không được kiểm tra.try-catch
các khối.Exception
s chủ yếu được gây ra bởi chính ứng dụng.SQLException
, IOException
ArrayIndexOutOfBoundException
, ClassCastException
,NullPointerException
đọc thêm: http://javaconceptoftheday.com/difference-b Among-error-vs-exception-in-java/
Sun đặt nó tốt nhất :
Lỗi là một lớp con của throwable chỉ ra các vấn đề nghiêm trọng mà một ứng dụng hợp lý không nên cố gắng nắm bắt.
Mô tả về Error
lớp học khá rõ ràng:
An
Error
là một lớp conThrowable
chỉ ra những vấn đề nghiêm trọng mà một ứng dụng hợp lý không nên cố gắng nắm bắt. Hầu hết các lỗi như vậy là điều kiện bất thường. CácThreadDeath
lỗi, mặc dù một điều kiện "bình thường", cũng là một lớp con củaError
bởi vì hầu hết các ứng dụng không nên cố gắng nắm bắt nó.Một phương thức không bắt buộc phải khai báo trong mệnh đề ném của nó, bất kỳ lớp con nào của
Error
nó có thể bị ném trong quá trình thực thi phương thức nhưng không bị bắt, vì các lỗi này là điều kiện bất thường không bao giờ xảy ra.
Trích dẫn từ tài liệuError
riêng của lớp Java .
Nói tóm lại, bạn không nên bắt Error
s, ngoại trừ bạn có lý do chính đáng để làm điều đó. (Ví dụ: để ngăn việc triển khai máy chủ web của bạn gặp sự cố nếu một servlet hết bộ nhớ hoặc một cái gì đó tương tự.)
Exception
Mặt khác, An chỉ là một ngoại lệ bình thường như trong bất kỳ ngôn ngữ hiện đại nào khác. Bạn sẽ tìm thấy một mô tả chi tiết trong tài liệu API Java hoặc bất kỳ tài nguyên trực tuyến hoặc ngoại tuyến nào.
Có một số điểm tương đồng và khác biệt giữa các lớp java.lang.Exception
và java.lang.Error
.
Điểm tương đồng:
Đầu tiên - cả lớp kéo dài java.lang.Throwable
và kết quả là kế thừa rất nhiều các phương pháp đó là phổ biến được sử dụng khi giao dịch với các lỗi như: getMessage
, getStackTrace
, printStackTrace
và vân vân.
Thứ hai, vì là lớp con của java.lang.Throwable
cả hai đều thừa hưởng các thuộc tính sau:
Bản thân throwable và bất kỳ lớp con nào của nó (bao gồm java.lang.Error
) có thể được khai báo trong danh sách ngoại lệ phương thức bằng throws
từ khóa. Tuyên bố như vậy yêu cầu chỉ cho java.lang.Exception
và lớp con, cho java.lang.Throwable
, java.lang.Error
và java.lang.RuntimeException
và các lớp con của họ nó là không bắt buộc.
Chỉ java.lang.Throwable
và các lớp con được phép sử dụng trong catch
mệnh đề.
Chỉ java.lang.Throwable
và các lớp con có thể được sử dụng với từ khóa - throw
.
Kết luận từ thuộc tính này là theo cả hai java.lang.Error
và java.lang.Exception
có thể được khai báo trong tiêu đề phương thức, có thể là catch
mệnh đề, có thể được sử dụng với từ khóa throw
.
Sự khác biệt:
Sự khác biệt về khái niệm đầu tiên: java.lang.Error
được thiết kế để ném bởi JVM và chỉ ra các vấn đề nghiêm trọng và có ý định dừng thực thi chương trình thay vì bị bắt (nhưng có thể như đối với bất kỳ java.lang.Throwable
người kế nhiệm nào khác ).
Một đoạn từ mô tả javadoc về java.lang.Error
:
... Chỉ ra những vấn đề nghiêm trọng mà một ứng dụng hợp lý không nên cố gắng nắm bắt.
Ngược lại java.lang.Exception
được thiết kế để thể hiện các lỗi dự kiến và có thể được xử lý bởi một lập trình viên mà không chấm dứt thực hiện chương trình.
Một đoạn từ mô tả javadoc về java.lang.Exception
:
... Chỉ ra các điều kiện mà một ứng dụng hợp lý có thể muốn nắm bắt.
java.lang.Error
và java.lang.Exception
lần đầu tiên được coi là một ngoại lệ không được kiểm tra đối với kiểm tra ngoại lệ thời gian biên dịch. Vì mã kết quả ném java.lang.Error
hoặc các lớp con của nó không yêu cầu khai báo lỗi này trong tiêu đề phương thức. Trong khi ném java.lang.Exception
khai báo cần thiết trong tiêu đề phương thức.Throwable và sơ đồ lớp kế thừa của nó (thuộc tính và phương thức được bỏ qua).
IMO một lỗi là một cái gì đó có thể khiến ứng dụng của bạn bị lỗi và không nên xử lý. Một ngoại lệ là một cái gì đó có thể gây ra kết quả không thể đoán trước, nhưng có thể được phục hồi từ.
Thí dụ:
Nếu một chương trình đã hết bộ nhớ thì đó là một lỗi vì ứng dụng không thể tiếp tục. Tuy nhiên, nếu một chương trình chấp nhận một kiểu đầu vào không chính xác thì đó là một ngoại lệ vì chương trình có thể xử lý nó và chuyển hướng để nhận đúng kiểu đầu vào.
Lỗi chủ yếu là do môi trường mà ứng dụng đang chạy. Ví dụ, OutOfMemoryError xảy ra khi JVM hết bộ nhớ hoặc StackOverflowError xảy ra khi tràn ngăn xếp.
Các ngoại lệ chủ yếu được gây ra bởi chính ứng dụng. Ví dụ, NullPulumException xảy ra khi một ứng dụng cố gắng truy cập đối tượng null hoặc ClassCastException xảy ra khi một ứng dụng cố gắng truyền các loại lớp không tương thích.
Đây là một bản tóm tắt khá hay từ API Java mà Lỗi và Ngoại lệ thể hiện:
Lỗi là một lớp con của throwable chỉ ra các vấn đề nghiêm trọng mà một ứng dụng hợp lý không nên cố gắng nắm bắt. Hầu hết các lỗi như vậy là điều kiện bất thường. Lỗi ThreadDeath, mặc dù điều kiện "bình thường", cũng là một lớp con của Lỗi vì hầu hết các ứng dụng không nên cố gắng bắt lỗi.
Một phương thức không bắt buộc phải khai báo trong mệnh đề ném của nó bất kỳ lớp con Lỗi nào có thể bị ném trong quá trình thực thi phương thức nhưng không bị bắt, vì các lỗi này là điều kiện bất thường không bao giờ xảy ra.
OTOH, đối với trường hợp ngoại lệ, API Java cho biết:
Lớp Exception và các lớp con của nó là một dạng của throwable chỉ ra các điều kiện mà một ứng dụng hợp lý có thể muốn nắm bắt.
Lỗi được gây ra bởi môi trường nơi ứng dụng hoặc chương trình của bạn chạy. Hầu hết các lần, bạn có thể không phục hồi từ nó vì điều này kết thúc ứng dụng hoặc chương trình của bạn. Javadoc khuyên rằng bạn không nên bận tâm đến việc bắt các lỗi như vậy vì môi trường, ví dụ như JVM, các lỗi như vậy sẽ thoát ra.
Ví dụ:
VirtualMachineError
- Ném để chỉ ra rằng Máy ảo Java bị hỏng hoặc đã hết tài nguyên cần thiết để nó tiếp tục hoạt động.
OutOfMemoryError
xảy ra khi JVM hết bộ nhớ hoặc
StackOverflowError
xảy ra khi stack chạy qua.
Các ngoại lệ được gây ra bởi chính ứng dụng hoặc chương trình của bạn; có thể do sai lầm của bạn Hầu hết thời gian bạn có thể khôi phục từ nó và ứng dụng của bạn vẫn sẽ tiếp tục chạy. Bạn nên nắm bắt các lỗi đó để ngăn chặn việc chấm dứt bất thường ứng dụng hoặc chương trình của bạn và / hoặc có thể tùy chỉnh thông báo ngoại lệ để người dùng thấy một tin nhắn được định dạng độc đáo thay vì các thông báo ngoại lệ xấu mặc định nằm rải rác khắp nơi.
Ví dụ:
NullPointerException
xảy ra khi một ứng dụng cố gắng truy cập đối tượng null. hoặc Cố gắng truy cập một mảng với chỉ mục không tồn tại hoặc gọi một hàm có dữ liệu hoặc tham số sai.
Unchecked exceptions != RuntimeExceptions
;Unchecked exceptions = RuntimeExceptions + Errors
. Tôi biết rằng nó đặt ra câu hỏi: Lỗi có phải là ngoại lệ không? , nhưng đây là những gì họ viết. Đây chỉ là một trong những ví dụ sau: docs.oracle.com/javase/tutorial/essential/exceptions/ .