Các throws Exception
tuyên bố là một cách tự động theo dõi các phương pháp mà có thể ném một ngoại lệ vì lý do dự đoán nhưng không thể tránh khỏi. Khai báo thường cụ thể về loại hoặc các loại ngoại lệ có thể được đưa ra chẳng hạn như throws IOException
hoặc throws IOException, MyException
.
Tất cả chúng ta đều có hoặc cuối cùng sẽ viết mã dừng đột ngột và báo cáo một ngoại lệ do điều gì đó chúng ta không lường trước được trước khi chạy chương trình, chẳng hạn như chia cho 0 hoặc lập chỉ mục ngoài giới hạn. Vì các lỗi không được mong đợi bởi phương pháp, chúng không thể được "bắt" và xử lý bằng mệnh đề try catch. Bất kỳ người dùng không nghi ngờ nào của phương pháp cũng sẽ không biết về khả năng này và chương trình của họ cũng sẽ dừng lại.
Khi lập trình viên biết một số loại lỗi nhất định có thể xảy ra nhưng muốn xử lý các ngoại lệ này bên ngoài phương thức, phương thức có thể "ném" một hoặc nhiều loại ngoại lệ vào phương thức gọi thay vì xử lý chúng. Nếu người lập trình không khai báo rằng phương thức (có thể) ném một ngoại lệ (hoặc nếu Java không có khả năng khai báo nó), thì trình biên dịch sẽ không thể biết được và người dùng phương thức này sẽ phải biết về điều đó, bắt và xử lý bất kỳ ngoại lệ nào mà phương thức có thể ném ra. Vì các chương trình có thể có nhiều lớp phương thức được viết bởi nhiều chương trình khác nhau, nên rất khó (không thể) để theo dõi các phương thức nào có thể tạo ra ngoại lệ.
Mặc dù Java có khả năng khai báo các ngoại lệ, bạn vẫn có thể viết một phương thức mới với các ngoại lệ chưa được khai báo và chưa được khai báo, và Java sẽ biên dịch nó và bạn có thể chạy nó và hy vọng điều tốt nhất. Những gì Java sẽ không cho phép bạn làm là biên dịch phương thức mới của bạn nếu nó sử dụng một phương thức đã được khai báo là ném (các) ngoại lệ, trừ khi bạn xử lý (các) ngoại lệ đã khai báo trong phương thức của mình hoặc khai báo phương thức của bạn là ném cùng một (các) ngoại lệ hoặc nếu có nhiều ngoại lệ, bạn có thể xử lý một số và ném phần còn lại.
Khi một lập trình viên tuyên bố rằng phương thức ném ra một loại ngoại lệ cụ thể, nó chỉ là một cách tự động để cảnh báo những lập trình viên khác sử dụng phương thức rằng một ngoại lệ có thể xảy ra. Sau đó, lập trình viên có thể quyết định xử lý ngoại lệ hoặc chuyển cảnh báo bằng cách khai báo phương thức gọi cũng như ném ngoại lệ tương tự. Vì trình biên dịch đã được cảnh báo rằng có thể có ngoại lệ trong phương thức mới này, nên nó có thể tự động kiểm tra xem những người gọi phương thức mới trong tương lai có xử lý ngoại lệ hay không hoặc khai báo nó và thực thi điều này hay điều khác xảy ra.
Điều thú vị về loại giải pháp này là khi trình biên dịch báo cáo, Error: Unhandled exception type java.io.IOException
nó sẽ cung cấp tệp và số dòng của phương thức được khai báo để ném ngoại lệ. Sau đó, bạn có thể chọn chỉ cần vượt qua buck và khai báo phương thức của bạn cũng "ném IOException". Điều này có thể được thực hiện theo cách cho đến phương thức chính mà sau đó nó sẽ khiến chương trình dừng lại và báo cáo ngoại lệ cho người dùng. Tuy nhiên, tốt hơn là bạn nên nắm bắt ngoại lệ và giải quyết nó theo cách tốt đẹp như giải thích cho người dùng những gì đã xảy ra và cách khắc phục nó. Khi một phương thức bắt và xử lý ngoại lệ, nó không còn phải khai báo ngoại lệ nữa. Buck dừng lại ở đó để nói.