2015-04-24 27 views
13

Một câu hỏi đơn giản và tôi không thể tìm thấy câu trả lời cho nó. Có bắt buộc mọi ngoại lệ trong Java phải sử dụng try-catch không? Hay nó chỉ dành cho FileNotFoundException?Mọi ngoại lệ đều có thử bắt buộc không?

Rất nhiều trường hợp ngoại lệ (IndexOutOfBoundException, ArithmeticException, IlligalArgumentException, NullPointerException) đang nói rằng họ không cần ngoại lệ, nhưng FileNotFoundException có) ... và tôi không thể tìm thấy câu trả lời và cần thử bắt.

+2

Câu trả lời khác nhau. – Youri

+0

Bạn có thể làm rõ thêm một chút không. – Blip

+0

Đọc tại đây [Ngoại lệ oracle doc] https://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html –

Trả lời

27

Không nhất thiết phải có khối try/catch cho trường hợp ngoại lệ của bạn. Thay vào đó, bạn có thể throw họ cho người có thể xử lý ngoại lệ đúng cách.

Có 2 loại ngoại lệ: Đã chọn và Bỏ chọn. Một ngoại lệ được kiểm tra có thể được coi là được trình biên dịch tìm thấy và trình biên dịch biết rằng nó có cơ hội xảy ra, vì vậy bạn cần phải catch hoặc throw nó. Ví dụ, mở một tập tin. Nó có cơ hội thất bại, và trình biên dịch biết điều này, vì vậy bạn buộc phải catch hoặc throw khả năng IOException.

Ngoại lệ không được kiểm tra có thể được coi là một cơ hội có khả năng xảy ra, nhưng dựa trên mã của bạn, trình biên dịch không biết. Nói cách khác, đó là lỗi lập trình . Ví dụ: nếu bạn đang sử dụng dữ liệu nhập của người dùng và mong đợi một số và người dùng nhập nội dung bạn không mong đợi, chẳng hạn như chuỗi, chương trình của bạn sẽ ném một số NumberFormatException. Bạn có thể dự đoán các tình huống này và đặt try/catch để thử và tránh chúng trước khi chúng xảy ra. Rất hiếm khi nhìn thấy là một người thêm một số throws NullPointerException hoặc throws NumberFormatException (hoặc ném bất kỳ ngoại lệ không được kiểm soát nào khác, cho vấn đề đó). Nó được cho phép, nhưng rõ ràng tạo ra ngoại lệ đó là lạ và hầu hết mọi người sẽ nói rằng đó là phong cách mã hóa xấu.

Lưu ý rằng tất cả các đề xuất Đã kiểm tra phải bị bắt hoặc bị ném vào thứ có thể xử lý; nếu bạn không làm điều đó, chương trình của bạn sẽ không biên dịch. Nếu bạn ném nó vào một cái gì đó mà không thể xử lý nó, sau đó chương trình của bạn sẽ có khả năng sụp đổ nếu nó xảy ra.

Cũng lưu ý rằng Ngoại lệ không được kiểm tra (ví dụ: một trong những xảy ra trong thời gian chạy, thường qua đầu vào người dùng xấu hoặc không có điều gì) cũng thường sẽ làm hỏng chương trình của bạn. Do đó, bạn nên sử dụng try/catch khi có điều gì đó có thể xảy ra sai, nhưng bạn không phải. Cũng cần lưu ý rằng trong khi các ngoại lệ được kiểm tra là các lớp con của ngoại lệ ngoại lệ và không được kiểm tra là các lớp con của RuntimeException, thì chính RuntimeException là một lớp con của Ngoại lệ. Điều đó có nghĩa rằng nếu bạn thực sự muốn, một đơn try {} catch (Exception e) {} sẽ bắt mọi ngoại lệ duy nhất mà chương trình của bạn có thể ném. Cấp, điều này được coi là một cách khủng khiếp để đối phó với trường hợp ngoại lệ, và bạn nên bắt mỗi một cách riêng biệt để bạn có thể xử lý chúng một cách riêng biệt. Hãy cố gắng không sử dụng nó.

2

Không, không phải mọi ngoại lệ đều yêu cầu thử. Mọi ngoại lệ được kiểm tra đều yêu cầu bắt thử. Ví dụ, một NullPointerException là một ngoại lệ không được kiểm soát, do đó, nó không đòi hỏi một try-catch, trong khi một FileNotFoundException được kiểm tra, do đó, nó đòi hỏi một. Bạn cũng có thể thêm "ném" vào chữ ký của phương thức và do đó, tránh cần thử.

+1

Ngoại lệ không mong muốn là thuật ngữ xấu để mô tả non-RuntimeException – Kon

+0

Bạn nói đúng. Thuật ngữ chính xác là "đã chọn" và "không được chọn". Tôi sẽ chỉnh sửa câu trả lời cho phù hợp. –

0

Chỉ trường hợp ngoại lệ đã kiểm tra cần phải nắm bắt nó, đối với tất cả các loại ngoại lệ khác, bạn có thể sử dụng "ném" vào chữ ký phương thức.

1

đọc: https://docs.oracle.com/javase/tutorial/essential/exceptions/

Về cơ bản kiểm tra trường hợp ngoại lệ cần phải được xử lý hoặc ném Exceptions không được kiểm soát và lỗi có thể bị xử lý hoặc ném (mặc dù xử lý lỗi là trong thực tế xấu coi chung).

Kiểm tra ngoại lệ là tất cả những gì được thừa hưởng từ java.lang.Exception

ngoại lệ không được kiểm soát là tất cả những gì được thừa hưởng từ java.lang.RuntimeException

Lỗi được tất cả những gì được thừa hưởng từ java.lang.Error

0

Có, nhưng nếu bạn không muốn xử lý nó theo phương pháp của mình, bạn có thể chuyển ngoại lệ cho người gọi phương thức bằng từ khóa throws. Ví dụ:

void execption() throws Exception { 
    throw new Exception(); 
} 

void caller() { 
    try { 
     execption(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Edit: Tôi là một chút gỉ trên java của tôi, giống như Josh nói rằng bạn có thể có trường hợp ngoại lệ được kiểm soát mà không cần một thử/bắt như NullPointerException, nhưng bạn có thể thêm một nếu bạn nghĩ rằng một ngoại lệ không được kiểm soát có thể bị ném. Ví dụ:

Object obj = null; 

obj.hashCode();// if you think a NPE will be thrown you can use a try/catch here 
0

Khi phương pháp bạn gọi rõ ràng là ném ngoại lệ thì bạn phải sử dụng vòng lặp try....catch. Nhưng trong trường hợp danh sách bạn đã đưa ra là tất cả các ngoại lệ thời gian chạy. Họ bị ném khi đôi khi một chương trình có đầu vào không được mong đợi hoặc chương trình được đưa vào một số sử dụng mà chương trình không được dự định. Đây sẽ không yêu cầu một vòng lặp try....catch.

Các vấn đề liên quan