Tôi chưa bao giờ sử dụng mệnh đề "ném", và hôm nay một người bạn đời nói với tôi rằng tôi phải ghi rõ trong khai báo phương thức ngoại lệ mà phương pháp có thể ném. Tuy nhiên, tôi đã sử dụng ngoại lệ mà không gặp phải vấn đề gì mà không cần làm, vì vậy, tại sao nó lại cần thiết nếu, trên thực tế, nó là cần thiết?Điều gì sẽ xảy ra nếu một phương thức ném ngoại lệ không được chỉ định trong khai báo phương thức bằng "ném"
Trả lời
Java có hai loại ngoại lệ khác nhau: kiểm tra Ngoại lệ và bỏ chọn Ngoại lệ.
Trường hợp ngoại lệ không được chọn là các lớp con của RuntimeException
và bạn không phải thêm tuyên bố ném. Tất cả các ngoại lệ khác phải được xử lý trong phần thân phương thức, hoặc với câu lệnh try/catch hoặc khai báo ném.
Ví dụ về ngoại lệ không được kiểm tra: IllegalArgumentException
đôi khi được sử dụng để thông báo, rằng một phương pháp đã được gọi với các đối số bất hợp pháp. Không cần ném.
Ví dụ về ngoại lệ đã kiểm tra: IOException
rằng một số phương pháp từ gói java.io
có thể bị ném. Hoặc sử dụng try/catch hoặc thêm throws IOException
vào khai báo phương thức và xử lý ngoại lệ ủy nhiệm cho người gọi phương thức.
'ném' các từ khóa trợ giúp để ủy quyền xử lý ngoại lệ cho các thành phần khác. Xem bản trình diễn video: http://www.bitspedia.com/2013/11/how-to-delegate-exception-handling.html –
- Bạn cần khai báo ngoại lệ đã kiểm tra mà phương thức của bạn sẽ ném.
- Nếu bạn tuyên bố 'ném ngoại lệ' mà phần lớn bao gồm hầu hết nếu không phải tất cả ngoại lệ đã kiểm tra
- Bạn luôn có thể ném ngoại lệ thời gian chạy không được kiểm tra và không phải khai báo.
Im khá chắc chắn nếu bạn cố gắng ném ngoại lệ đã kiểm tra và chưa khai báo phương thức là ném loại đó, mã sẽ không biên dịch (kiểm tra ngay bây giờ).
EDIT, phải vì thế nếu bạn thử một cái gì đó đơn giản như
public static void main(String[] args) {
throw new Exception("bad");
}
bạn nhận được một lỗi biên dịch.
Cụ thể cho câu hỏi của bạn, nếu bạn gọi phương thức được khai báo để ném ngoại lệ, bạn phải thử/nắm bắt lời gọi phương thức hoặc tuyên bố rằng phương thức của bạn sẽ ném ngoại lệ.
Vấn đề là tôi không biết rằng có những ngoại lệ được kiểm tra và không được kiểm tra. Tôi sẽ chấp nhận câu trả lời của bạn nếu không phải vì Andreas_D đã cho tôi câu trả lời hoàn hảo. Cảm ơn! – bluehallu
Nếu một phương thức được khai báo với từ khóa ném thì bất kỳ phương thức nào khác muốn gọi phương thức đó phải được chuẩn bị để bắt hoặc khai báo rằng chính nó sẽ ném một ngoại lệ.
Ví dụ nếu bạn muốn tạm dừng các ứng dụng mà bạn phải gọi Thread.sleep(milliseconds);
Nhưng tờ khai cho phương pháp này nói rằng nó sẽ ném ra một Tuyên bố InterruptedException
:
public static void sleep(long millis) throws InterruptedException
Vì vậy, nếu bạn muốn gọi nó là ví dụ trong phương pháp chính của bạn, bạn phải nắm bắt nó:
public static void main(String args[]) {
try {
Thread.sleep(1000);
} catch(InterruptedException ie) {
System.out.println("Opps!");
}
}
Hoặc thực hiện phương pháp này cũng tuyên bố rằng nó được ném một ngoại lệ:
public static void main(String args[]) throws InterruptedException {
Thread.sleep(1000);
}
trong ví dụ cuối cùng của bạn, làm cách nào để tôi nắm bắt ngoại lệ? –
@somefolk Trong ví dụ cuối của tôi, chương trình sẽ không bắt được 'InterruptedException' vì' throws' nằm trong hàm 'main()'. Nếu xảy ra thì chương trình sẽ đột ngột kết thúc. – Anton
Nó có thể xảy ra, ngay cả với kiểm tra trường hợp ngoại lệ. Và đôi khi nó có thể phá vỡ đăng nhập.
Giả sử một phương pháp thư viện sử dụng thủ thuật này để cho phép một thực hiện Runnable
có thể ném IOException
:
class SneakyThrowTask implements Runnable {
public void run() {
throwSneakily(new IOException());
}
private static RuntimeException throwSneakily(Throwable ex) {
return unsafeCastAndRethrow(ex);
}
@SuppressWarnings("unchecked")
private static <X extends Throwable>X unsafeCastAndRethrow(Throwable ex) throws X {
throw (X) ex;
}
}
Và bạn gọi nó như thế này:
public static void main(String[] args) {
try {
new SneakyThrowTask().run();
} catch (RuntimeException ex) {
LOGGER.log(ex);
}
}
Trường hợp ngoại lệ sẽ không bao giờ được đăng nhập. Và bởi vì đó là ngoại lệ được kiểm tra, bạn không thể viết điều này:
public static void main(String[] args) {
try {
new SneakyThrowTask().run();
} catch (RuntimeException ex) {
LOGGER.log(ex);
} catch (IOException ex) {
LOGGER.log(ex); // Error: unreachable code
}
}
Nhưng bạn có bao giờ viết mã như vậy không? Chỉ cần tự hỏi trong tình huống nào người ta có thể muốn viết mã như vậy – Sameer
- 1. Điều gì sẽ xảy ra khi ném ngoại lệ C++?
- 2. Điều gì sẽ xảy ra khi tôi ném ngoại lệ C++ từ một phương thức Java gốc?
- 3. Điều gì sẽ xảy ra nếu bạn ném một Ngoại lệ từ bên trong UncaughtExceptionHandler?
- 4. Điều gì sẽ xảy ra nếu tôi sử dụng "ném"; mà không có ngoại lệ để ném?
- 5. Việc ném một ngoại lệ trong một phương thức có khiến phương thức trả về không?
- 6. Điều gì sẽ xảy ra khi Chủ đề ném ngoại lệ?
- 7. Điều gì sẽ xảy ra khi một luồng .NET ném một ngoại lệ?
- 8. Điều gì sẽ xảy ra khi một ngoại lệ được ném vào trong móc tắt máy trong java
- 9. Thực hành không tốt là viết một phương thức không làm gì ngoại trừ việc ném một ngoại lệ?
- 10. Phương pháp khai báo để ném ngoại lệ và phân lớp của ngoại lệ này
- 11. Phương thức Object.wait() có phản hồi màn hình khi nó ném một ngoại lệ không?
- 12. Có được phép ném ngoại lệ NotImplemented trong các phương thức ảo không?
- 13. Liệt kê tất cả các ngoại lệ có thể được ném bằng phương thức
- 14. Tại sao '{' ném một NullReferenceException trong một phương thức tĩnh?
- 15. Điều gì có thể xảy ra khi ném một ngoại lệ dành riêng trong C#?
- 16. Điều gì sẽ xảy ra khi bạn gọi một phương thức tĩnh trong C#?
- 17. Các phương thức có nên ném RuntimeException cho biết nó trong chữ ký phương thức?
- 18. Điều gì xảy ra nếu ném; câu lệnh được thực hiện bên ngoài khối catch?
- 19. JDK 1.7 Phương thức `addSuppressed()` có thể ném được
- 20. Khai báo và ném so với các trường hợp ngoại lệ không được khai báo
- 21. Cách nhận tên của phương thức gây ra ngoại lệ
- 22. ngoại lệ trong phương thức Finalize
- 23. tuyên bố một phương pháp luôn ném một ngoại lệ?
- 24. Phương thức xử lý ngoại lệ Java
- 25. Phương pháp JAXB XMLAdapter không ném ngoại lệ
- 26. Làm thế nào để gọi một phương thức mà ném một ngoại lệ bằng cách sử dụng Java Reflection?
- 27. Thử-với-tài nguyên: Tôi có phải ném hoặc nắm bắt các ngoại lệ của phương thức close() không?
- 28. Hãy thử bắt cuối cùng: Làm điều gì đó nếu không có ngoại lệ được ném
- 29. C# finalizer ném ngoại lệ?
- 30. Java cuối cùng chặn và ném ngoại lệ ở cấp phương thức
Bạn chỉ bị buộc phải chỉ định ngoại lệ được kiểm tra (và điều đó thực sự gây phiền nhiễu). Khi bạn không làm như vậy trình biên dịch nên khiếu nại. –
Tôi đã bỏ phiếu để mở câu hỏi này vì câu hỏi và câu trả lời đưa ra mức độ phù hợp tốt về ** ném ** với ** ngoại lệ ** và ** không được kiểm tra **. – AdrianHHH