2009-06-26 22 views

Trả lời

13

Trường hợp ngoại lệ không được kiểm soát là các ngoại lệ không cần bị bắt trong khối try - catch. Các ngoại lệ không được chọn là các lớp con của các lớp RuntimeException hoặc Error.

Trường hợp ngoại lệ được kiểm tra là các ngoại lệ cần phải bị chặn trong khối try - catch.

Định nghĩa về trường hợp ngoại lệ được kiểm tra và không được kiểm soát có thể được tìm thấy trong Section 11.2: Compile-Time Checking of Exceptions của The Java Language Specification:

Các trường hợp ngoại lệ được kiểm soát lớp học là lớp RuntimeException và của lớp con, và lớp Error và lớp con của nó. Tất cả các lớp ngoại lệ khác được kiểm tra ngoại lệ.

Chỉ vì một ngoại lệ được kiểm soát là bị bắt trong một khối catch không làm cho nó một ngoại lệ kiểm tra - nó chỉ có nghĩa là ngoại lệ không được kiểm soát đã bị bắt, và đã được xử lý trong khối catch.

Có thể catch ngoại lệ không được kiểm soát và sau đó là throw ngoại lệ được kiểm tra mới, vì vậy bất kỳ phương pháp nào gọi phương thức đó, ngoại lệ không được kiểm soát có thể xảy ra và buộc phương thức gọi nó xử lý một số loại ngoại lệ.

Ví dụ: NumberFormatException có thể được ném khi xử lý một số không thể phân tích String đến phương pháp Integer.parseInt là một ngoại lệ không được kiểm soát, do đó không cần bị bắt. Tuy nhiên, phương pháp gọi phương pháp đó có thể muốn gọi của nó để xử lý đúng đắn một vấn đề như vậy, vì vậy nó có thể ném một ngoại lệ được kiểm tra (không phải là một lớp con của RuntimeException.):

public int getIntegerFromInput(String s) throws BadInputException { 
    int i = 0; 
    try { 
     i = Integer.parseInt(s); 
    catch (NumberFormatException e) { 
     throw new BadInputException(); 
    } 

    return i; 
} 

Trong ví dụ trên, một NumberFormatException bị bắt trong khối try - catchBadInputException mới (được dự định là ngoại lệ đã kiểm tra) được ném.

Bất kỳ người gọi nào đến phương thức getIntegerFromInput cũng sẽ bị bắt buộc phải bắt số BadInputException và bị buộc phải xử lý các thông tin nhập không hợp lệ. Nếu NumberFormatException không bị bắt và xử lý, mọi người gọi đến phương pháp này sẽ phải xử lý ngoại lệ một cách chính xác.

(Ngoài ra, cần lưu ý, ăn một ngoại lệ và làm điều gì đó mà không phải là thực sự có ý nghĩa không được coi là một thực hành tốt -. Xử lý ngoại lệ nơi xử lý ngoại lệ có ý nghĩa có thể được thực hiện)

Từ Java Tutorials :

+0

+1 cho 'ăn ngoại lệ và làm điều gì đó không thực sự có ý nghĩa không được coi là thực hành tốt - xử lý các ngoại lệ trong đó có thể thực hiện xử lý ngoại lệ có ý nghĩa' –

1

Tôi nghĩ rằng sự khác biệt là trình biên dịch sẽ cờ còn tự do kiểm tra ngoại lệ và phương pháp mà ném ngoại lệ kiểm tra nhưng không khai báo trong chữ ký phương pháp tại thời gian biên dịch.

Trường hợp ngoại lệ không được kiểm tra không yêu cầu khai báo hoặc bắt, nhưng không bị cấm. Trình biên dịch không xác định chúng là lỗi.

4

Không, nó không được gọi là ngoại lệ đã kiểm tra chỉ vì nó bị bắt. Một khối catch có thể được viết để bắt bất kỳ loại ngoại lệ hoặc lỗi nào. Các trường hợp ngoại lệ được kiểm tra là các ngoại lệ phải tuân theo Catch or Specify Requirement, có nghĩa là bạn đang yêu cầu để bắt chúng hoặc tuyên bố rằng phương pháp của bạn có thể ném chúng. Bạn có thể nghĩ về thuật ngữ đã kiểm tra như ý nghĩa trình biên dịch sẽ kiểm tra để đảm bảo bạn tuân thủ yêu cầu bắt giữ hoặc chỉ định. Lỗi và RuntimeExceptions được gọi là bỏ chọn ngoại lệ vì trình biên dịch không thực thi yêu cầu này trên chúng.

Các vấn đề liên quan