2010-04-23 33 views
30

Đây là câu hỏi phỏng vấn. Sự khác biệt chính giữa ngoại lệ và lỗi không được kiểm soát là cả hai đều không bị bắt? Họ sẽ chấm dứt chương trình.Sự khác biệt giữa ngoại lệ không được kiểm soát hoặc ngoại lệ thời gian chạy

+4

Tiêu đề của bạn nói điều gì đó khác với câu hỏi. Bạn có muốn biết về sự khác biệt giữa RuntimeException và Error hoặc giữa Unchecked và RuntimeException? –

+2

Nó không * Sự khác biệt giữa X ** hoặc ** Y *, nhưng đó là * Sự khác biệt giữa X ** và ** Y *. Và thực sự, nó là giữa ngoại lệ không được kiểm soát và ngoại lệ thời gian chạy hoặc giữa ngoại lệ và lỗi không được kiểm soát? – BalusC

+0

Hình như câu hỏi phỏng vấn tương tự này đang được hỏi rất nhiều: http://stackoverflow.com/questions/2693329/difference-between-errors-and-unchecked-exceptions-in-java – justkt

Trả lời

8

JavaDocs tổng hợp những điều này khá tốt.

java.lang.RuntimeException:

RuntimeException is the superclass of those exceptions that can be thrown during the normal operation of the Java Virtual Machine.

A method is not required to declare in its throws clause any subclasses of RuntimeException that might be thrown during the execution of the method but not caught.

java.lang.Error:

An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. The ThreadDeath error, though a "normal" condition, is also a subclass of Error because most applications should not try to catch it.

A method is not required to declare in its throws clause any subclasses of Error that might be thrown during the execution of the method but not caught, since these errors are abnormal conditions that should never occur.

Lưu ý rằng "ngoại lệ không được kiểm soát" chỉ đơn thuần là một từ đồng nghĩa với một RuntimeException.

+0

http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime .html cũng cung cấp mô tả chi tiết về các differeneces – ChadNC

+1

Tôi nghĩ rằng việc viết ngoại lệ không được kiểm soát là một từ đồng nghĩa của 'RuntimeException' là gây hiểu nhầm (và không đúng). –

+0

@Pascal, như thế nào? Tôi nghĩ rằng bất cứ khi nào ai đó đề cập đến một "ngoại lệ không được kiểm soát" trong Java họ đang đề cập đến một số lớp con của RuntimeException, không? –

1

RuntimeExceptions và lỗi như OutOfMemoryError không cần phải bị bắt và có thể được ném cho đến khi chúng đến được chính() sẽ chấm dứt ứng dụng.

Ngoại lệ khác gây ra lỗi biên dịch nếu chúng không bị bắt hoặc đưa vào danh sách ném.

4

Lưu ý: một RuntimeException là một ngoại lệ được kiểm soát

Một ngoại lệ không được kiểm soát sẽ là một trong đó là được biết đến là có thể tại một điểm trong việc thực hiện nhưng không được bắt, ví dụ như một NullPointerException luôn là một khả năng nếu bạn don 't kiểm tra cho họ và sẽ gây ra chương trình của bạn để chấm dứt. Bạn có thể kiểm tra nó bằng cách gói mã trong try-catch, nhưng điều này không được thực thi (không giống như một ngoại lệ đã kiểm tra sẽ thực thi rằng ngoại lệ được xử lý theo một cách nào đó).

Lỗi là một thứ có thể xảy ra tại bất kỳ thời điểm nào trong quá trình thực thi và không thực sự bị bắt vì nó không được gây ra bởi một cuộc gọi phương thức cụ thể, v.v. Ví dụ: OutOfMemoryError hoặc StackOverflowError. Cả hai điều này có thể xảy ra bất kỳ lúc nào và sẽ khiến ứng dụng của bạn chấm dứt. Việc nắm bắt các lỗi này không có ý nghĩa gì khi chúng biểu thị rằng có điều gì đó đã xảy ra mà bạn sẽ không thể khôi phục được.

+4

Không, đó là cách khác. Một ngoại lệ thời gian chạy IS-Một ngoại lệ không được kiểm soát. – BalusC

3

Lỗi cho biết các vấn đề cơ bản không bao giờ xảy ra. Nếu bạn gặp lỗi s.th. thực sự xấu đã xảy ra.
Ngoại lệ không được kiểm soát (Ngoại lệ thời gian chạy) được sử dụng bất cứ khi nào ngoại lệ có thể được mong đợi bằng cách nào đó, nhưng không có cách hợp lý để xử lý nó và do đó câu lệnh thử sẽ gây phiền toái và lãng phí dung lượng.

+2

RuntimeException là một tập con của ngoại lệ không được kiểm soát, không phải là một từ đồng nghĩa. –

59

Như đã trình bày bởi tên của họ, trường hợp ngoại lệ được kiểm soátkhông kiểm tra tại thời gian biên dịch có nghĩa là trình biên dịch không đòi hỏi phương pháp để bắt hoặc chỉ định (với một throws) cho họ.Lớp học thuộc loại này được trình bày chi tiết trong phần 11.2 Compile-Time Checking of Exceptions của JLS:

The unchecked exceptions classes are the class RuntimeException and its subclasses, and the class Error and its subclasses. All other exception classes are checked exception classes. The Java API defines a number of exception classes, both checked and unchecked. Additional exception classes, both checked and unchecked, may be declared by programmers. See §11.5 for a description of the exception class hierarchy and some of the exception classes defined by the Java API and Java virtual machine.

Bức tranh dưới đây minh họa hệ thống phân cấp Ngoại lệ:

alt text

Lớp Error và lớp con của nó là trường hợp ngoại lệ mà từ đó bình thường các chương trình thường không được khôi phục và, như được giải thích trong 11.5 The Exception Hierarchy:

The class Error is a separate subclass of Throwable , distinct from Exception in the class hierarchy, to allow programs to use the idiom:

} catch (Exception e) { 

to catch all exceptions from which recovery may be possible without catching errors from which recovery is typically not possible.

Để tóm tắt, RuntimeException là một tập con của ngoại lệ không được kiểm tra cho trường hợp ngoại lệ có thể phục hồi (nhưng ngoại lệ không được chọn không phải là từ đồng nghĩa của RuntimeException khi nhiều người trả lời ở đây).

1

Ngoại lệ lỗi và thời gian chạy được gọi chung là ngoại lệ không được kiểm soát.

ngoại lệ thời gian chạy là các điều kiện ngoại lệ bên trong ứng dụng và ứng dụng đó thường không thể dự đoán hoặc phục hồi. Các lỗi này thường chỉ ra các lỗi lập trình, chẳng hạn như lỗi logic hoặc sử dụng không đúng API

Bạn có thể xem liên kết này giải thích ba loại ngoại lệ.

http://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

Tôi hy vọng điều này sẽ hữu ích.

+1

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – ivarni

+1

@ivarni Tôi cập nhật nó hy vọng rằng sẽ giúp :) cảm ơn bạn đã phản hồi. –

2

Lỗi: Đây là những điều kiện ngoại lệ là bên ngoài cho ứng dụng và ứng dụng thường không thể dự đoán hoặc khôi phục.

Runtime ngoại lệ: Đây là những điều kiện đặc biệt đó là nội để ứng dụng, và rằng việc áp dụng thường không thể lường trước hoặc phục hồi từ.

Bạn có thể muốn đọc this: Exception

1

Checked:

  • Các lớp học kéo dài Throwable lớp trừ RuntimeExceptionError được gọi là trường hợp ngoại lệ kiểm tra.
  • Còn được gọi là ngoại lệ thời gian biên dịch vì loại ngoại lệ này được kiểm tra tại thời gian biên dịch. Điều đó có nghĩa là nếu chúng tôi bỏ qua các ngoại lệ này (không được xử lý với try/catch hoặc throw ngoại lệ) thì xảy ra lỗi biên dịch.
  • Chúng là các vấn đề có thể khôi phục có thể lập trình do các điều kiện bất ngờ ngoài kiểm soát mã (ví dụ: cơ sở dữ liệu, lỗi I/O tệp, nhập sai, v.v.)
  • Chúng tôi có thể tránh chúng bằng cách sử dụng khối try/catch.
  • Ví dụ:IOException, SQLException vv

ngoại lệ không được kiểm soát:

  • Các lớp học kéo dài RuntimeException được gọi là trường hợp ngoại lệ được kiểm soát
  • trường hợp ngoại lệ không được kiểm soát không được kiểm tra tại thời gian biên dịch thay vào đó chúng được kiểm tra tại thời gian chạy. Và đó là lý do tại sao chúng còn được gọi là "" Thời gian chạy ngoại lệ "
  • Chúng cũng là các vấn đề có thể phục hồi có lập trình nhưng không giống như ngoại lệ đã kiểm tra chúng do lỗi trong luồng mã hoặc cấu hình.
  • Ví dụ:ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException vv
  • Vì họ đang lập trình lỗi, họ có thể tránh được bằng cách độc đáo/mã hóa một cách khôn ngoan. Ví dụ "chia cho số không" xảy ra ArithmeticEceeption. Chúng ta có thể tránh chúng bằng cách đơn giản nếu điều kiện - if(divisor!=0). Tương tự như vậy chúng ta có thể tránh NullPointerException bằng cách đơn giản kiểm tra các tài liệu tham khảo - if(object!=null) hoặc sử dụng thậm chí better techniques

Lỗi:

  • Error đề cập tình trạng không thu hồi mà không được xử lý bởi try/catch
  • Ví dụ :OutOfMemoryError, VirtualMachineError, AssertionError vv
Các vấn đề liên quan