2011-12-01 35 views
9

Có thể ném một ngoại lệ mà không bị bắt không?java ném ngoại lệ mà không bắt nó?

Ví dụ

public void foo() throws SomeException{ 
    // .... 
    if (somethingCatestrophic) throw new SomeException(); 
    // .... 
} 

Bây giờ tôi muốn gọi foo, nhưng không muốn để bắt bất kỳ lỗi nào, như là trường hợp ngoại lệ không bao giờ nên được ném vào runtime (trừ khi có một lỗi)

+0

có lý do nào bạn không muốn bắt nó không? Nếu đó là hiệu suất, như xa như tôi biết nó không có nhiều sự khác biệt đi qua một khối try-catch UNLESS ngoại lệ là thực sự ném, sau đó có rất nhiều chi phí. Nhưng nếu lỗi là thảm họa –

+0

Không, bởi vì lỗi không được giả định xảy ra (tức là lỗi lập trình, hoặc runtimeexceptions). – Pwnna

+0

Rất tiếc, đã đăng ở trên trước khi kết thúc. Lỗi tốt không bao giờ là 'giả sử' xảy ra! Nhưng có vẻ như bạn đang ném lỗi vì lợi ích của nó. Tôi nghĩ bạn cần phải suy nghĩ lại xem bạn có muốn ném lỗi ở địa điểm đầu tiên –

Trả lời

28

Trừ khi đó là thứ bạn đang lên kế hoạch và phục hồi từ địa phương, có thể tốt nhất trong trường hợp này để sử dụng ngoại lệ không được kiểm soát, ví dụ: RuntimeException phái sinh.

+2

Cảm ơn! Điều này là hữu ích cho việc viết mã không lạc quan, nơi tôi có thể có một ngoại lệ KHÔNG NÊN phải xảy ra nhưng có đó để cho một nhà phát triển khác biết rằng họ đã quên thứ gì đó trong mã của họ. –

1

Bạn có thể tránh bắt một ngoại lệ, nhưng nếu có một ngoại lệ ném và bạn không bắt nó chương trình của bạn sẽ ngừng thực hiện (sụp đổ).

Không có cách nào để bỏ qua ngoại lệ. Nếu ứng dụng của bạn không cần phải làm bất cứ điều gì để đáp ứng với một ngoại lệ nhất định, thì bạn sẽ chỉ cần nắm bắt nó, và sau đó không làm gì cả.

try { 
    ...some code that throws an exception... 
} catch (SomeException ex) { 
    // do nothing 
} 

LƯU Ý: Thường được coi là kiểu xấu và mọi người có thể cho bạn biết như vậy. Lý do thường được trích dẫn là, ngay cả khi bạn không làm bất kỳ điều gì với ngoại lệ, trong hầu hết các trường hợp, ít nhất bạn nên đăng nhập vào một nơi nào đó, thông báo cho người dùng hoặc thực hiện một số hành động thích hợp khác tùy thuộc vào ứng dụng của bạn và những gì gây ra ngoại lệ ngay từ đầu. Nếu bạn không chắc chắn lý do tại sao ngoại lệ bị ném (có thể đó là lỗi mà bạn chưa giải quyết), thì nói chung bạn nên ít nhất đăng nhập để bạn có thể tìm ra sau này.

+0

Hóa ra những gì tôi cần là RuntimeException, vì lỗi không bao giờ được giả định xảy ra (ngoại lệ không bao giờ bị ném trừ khi có lỗi trong mã), mà tôi hoàn toàn quên mất – Pwnna

0

Nếu SomeException là ngoại lệ được kiểm tra, phương thức gọi foo() sẽ phải bắt giữ ngoại lệ đó và xử lý ngoại lệ hoặc cũng được khai báo để ném SomeException hoặc cha hoặc mẹ của nó.

Nếu SomeException là ngoại lệ thời gian chạy, khi đó các phương thức gọi nó sẽ không cần bắt.

1

Tại sao bạn không bắt nó bên trong phương pháp?

Chỉ cần sử dụng khối try catch và tiếp tục, nếu ngoại lệ không đáng kể và không ảnh hưởng đến bất kỳ hành vi nào của chương trình của bạn.

+0

Vâng, quên hoàn toàn về RuntimeException. (Ở chế độ python.) – Pwnna

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