Tôi được thông báo rằng trong Java, các ngoại lệ không được kiểm soát có thể bị chặn trong một khối thử, nhưng nếu nó bị bắt, có phải nó được gọi là ngoại lệ đã kiểm tra không?Không phải là một ngoại lệ không được kiểm soát bị chặn trong khối thử đã kiểm tra ngoại lệ trong Java chưa?
Trả lời
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ớpError
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
- catch
và BadInputException
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 :
- Lessons: Exceptions
- The Catch or Specify Requirement - thảo luận về trường hợp ngoại lệ kiểm tra.
- Chained Exceptions - thực hành bắt ngoại lệ và ném một trường hợp ngoại lệ mới, như ví dụ trên.
- Unchecked Exceptions — The Controversy
+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' –
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.
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.
Sự trớ trêu của "đã kiểm tra" .... – Pacerier