30/09/2018, 18:25
Mục đích thêm 'throws IOException' vào hàm main?
Mình vừa học java không hiểu hàm
public static void main(String[] args) throws IOException
có lệnh throws IOException
để làm gì vậy ạ?
Bài liên quan
Câu hỏi hay. Riêng về mục đích của câu
throws IOException
thì câu lệnh này đặt ở đây là để thông báo rằng hàm này, tức là hàm main, có khả năng sẽthrows IOException
. Nhưng không throw cũng chả saoVí dụ ta có hàm
foo
có khai báothrows IOException
, thì khi hàmbar
gọi hàmfoo
, hàmbar
phải có try/catch để đề phòng trường hợpfoo
throw.IOException
là các exception liên quan tới đọc ghi.Có một câu hỏi tương tự trên SO, hỏi về vấn đề tại sao lại có
throws IOException
ở hàm main nhưng chưa có câu trả lời rõ ràngWhy it is mandatory to use "throws IOException"
Trong java thì có 2 loại exception: check và uncheck exception. Và IOException là loại check exception. Bắt buộc phải handle. Khi khai báo như thế có nghĩa là trong hàm đó sử dụng các method thao tác với file. như open/close …
Theo ý hiểu của mình thì cái việc throws Exception ở phần tên hàm sẽ tránh việc bạn phải sử dụng try catch ở trong hàm đó.
Trong cú pháp của java một số hàm throw exception thì khi gọi hàm này bắt buộc mình phải catch nó hoặc throw ra tiếp cho thằng ở trên gọi lại thằng này lần nữa bắt. Ở đây hiểu là trong hàm main có 1 lời gọi tới 1 hàm mà nó throw ra, và nó ko muốn catch cái exception này nên throw luôn cho jvm.
Cái này là bắt buộc nếu ko có throw IOException thì trong thân hàm phải try catch chứ ko phải là ko có cũng được. Theo mình hiểu là như thế
Trong hàm main thì không bắt buộc phải có dòng
throw IOException
đâu. Nhưng lý do tại sao lại mặc định có thì Đạt không rõ.Vì nếu mình không gọi hàm IO thì sao?
Không đúng rồi, nếu là hàm có throw thì bắt buộc phải catch, nếu không catch thì comiler báo lỗi liền.
Cái throw ở đầu đó chỉ là cách để cảnh báo rằng hàm này có khả năng sẽ throw, nên hàm nào gọi nó phải catch
Nếu mà viết như vậy trong thân hàm ko bắt buộc throw ra cái gì cả thì không hề có ý nghĩa gì cả. Cảnh báo ở đây là cảnh báo với ai? Với Developer hay với jvm?
Ý mình ở đây khi người ta viết vậy mục đích là để throw ra những exception không muốn catch. Kể cả trong hàm main
Bổ sung 1 ý là nếu ko catch trong hàm main mà throw ra thì cũng được chứ sao
Ý @lehoai là trông nội tại hàm có throws IOException thì không có try catch
cón thằng gọi thì sẻ phải try-catch hoặc throws lên tiếp
Cái này hiểu đơn giản thôi mà, tranh cãi làm gì .
Mọi người cứ hiểu đơn giản là khi một hàm chạy, nó có thể có Exception (ngoại lệ) phát sinh, bằng bất cứ lý do nào đó mà chương trình không mong muốn: Ví dụ: Đọc file nhưng file không tồn tại, convert String sang Number nhưng không phải là Number…
Những lỗi như thế chương trình sẽ throw 1 Exception tương ứng.
Vậy khi một hàm gặp lỗi ngoại lệ, thì ai sẽ chịu trách nhiệm xử lý nó?
(Đó là vấn đề mà mọi người đang thảo luận ở đây)
Có 2 cách:
Trường hợp hàm main là đặc biệt, vì nó là main thread, sẽ không có ai gọi nó để catch exception cả nên mặc dù vãn throw được Exception nhưng trương trình sẽ chết ngay tại lúc đó.
Thêm 1 ít thông tin nữa về Exception nhé.
Một vài người khi tiếp cận Exception thường nghĩ, sao Java lại sinh ra cái này làm gì, suốt ngày phải đi try catch tốn công.
Sau đó họ cứ try, catch thoải mái và thường thì catch xong không làm gì cả.
Đó là 1 sai lầm, không phải chương trình nào cũng chạy mượt mà, không phải người dùng nào cũng thao tác đúng như Ứng dụng mong muốn. Có rất nhiều yếu tố bên ngoài làm cho trương trình chạy sai.
Những yếu tố đó chính là Exception, theo suy nghĩ của mình thì việc quản lý và dùng Exception quan trọng như bạn code 1 chức năng quan trọng trong dự án.
Người dùng sẽ rất vui nếu như họ nhâp sai và nhận được thông báo: "Bạn đã nhập sai, dữ liệu không đúng định dạng ABCXYZ, Vui lòng nhập lại".
Và thật chán nếu nhận được thông báo: “Bạn đã nhập sai, Vui lòng nhập lại”
Exception cho ta biết chính xác lỗi ở đâu, lỗi tại sao, lỗi vì cái gì, vậy tại sao chúng ta lại coi nó như một cái rườm rà, rắc rối