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 ạ?

Mai Anh Dũng viết 20:26 ngày 30/09/2018

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ả sao

Ví dụ ta có hàm foo có khai báo throws IOException, thì khi hàm bar gọi hàm foo, hàm bar phải có try/catch để đề phòng trường hợp foo 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àng

stackoverflow.com
Mayur Patel

Why it is mandatory to use "throws IOException"

java, ioexception
asked by Mayur Patel on 04:01AM - 25 Feb 12
Nguyen Ca viết 20:31 ngày 30/09/2018

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 …

Điệp viết 20:32 ngày 30/09/2018

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 đó.

Le Hoai viết 20:41 ngày 30/09/2018

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ế

Mai Anh Dũng viết 20:30 ngày 30/09/2018

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?

Ở đâ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.

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

Le Hoai viết 20:30 ngày 30/09/2018

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

Nguyen Ca viết 20:28 ngày 30/09/2018

nếu là hàm có throw thì bắt buộc phải catch

Ý @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ương Nguyễn viết 20:27 ngày 30/09/2018

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:

  1. Chính nó chịu trách nhiệm: Sử dụng Try, Catch ngay trong hàm.
  2. Nó không chịu trách nhiệm: Ném cái Exception đó ra cho thằng nào trên nó xử lý. (đăng ký Throws Exception ở đầu hàm) -> nó không cần try catch làm gì cả.

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 đó.

Cương Nguyễn viết 20:32 ngày 30/09/2018

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

Bài liên quan
0