2012-11-22 31 views
13

Tôi đã được đọc JLS và tôi gặp phải phần 11.1.3. Asynchronous Exceptions từ mà tôi trích dẫn:Ngoại lệ không đồng bộ Java: Tôi có thể bắt chúng không?

Hầu hết các trường hợp ngoại lệ xảy ra đồng bộ như là kết quả của một hành động bởi chủ đề, trong đó chúng xảy ra, và tại một điểm trong chương trình là được chỉ định để có thể dẫn đến ngoại lệ như vậy. Ngược lại, ngoại lệ không đồng bộ là một ngoại lệ có khả năng xảy ra tại bất kỳ điểm nào trong việc thực thi chương trình.

trường hợp ngoại lệ không đồng bộ chỉ xảy ra như là kết quả của:

[...]

  • lỗi nội bộ hoặc hạn chế tài nguyên trong máy ảo Java mà ngăn chặn nó từ việc thực hiện ngữ nghĩa của ngôn ngữ lập trình Java . Trong trường hợp này, ngoại lệ không đồng bộ được ném là một cá thể của một lớp con của VirtualMachineError.

Có thể bắt ngoại lệ như vậy cho mục đích ghi nhật ký hoặc thông báo (vì tôi cho rằng điều đó không thể khôi phục)? Làm thế nào tôi có thể đạt được điều đó?

Trả lời

10

Bạn có thể bắt ngoại lệ như vậy giống như bất kỳ ngoại lệ nào khác. Vấn đề duy nhất là chúng có thể xảy ra tại bất kỳ địa điểm nào trong chương trình của bạn, do đó, việc đánh bắt chúng một cách đáng tin cậy là rất khó. Về cơ bản, bạn phải bọc phương thức run của tất cả các chủ đề và phương thức main trong khối try..catch, nhưng bạn không thể thực hiện điều đó cho các chủ đề mà bạn không kiểm soát (như Swing EDT hoặc chủ đề cho bộ hẹn giờ, v.v.).

Cũng không nên đánh dấu bất kỳ lớp con nào là Error vì JVM có thể ở trạng thái không ổn định, có thể dẫn đến lỗi thêm (ví dụ: trong trường hợp OutOfMemoryError, bạn có thể không có đủ bộ nhớ để xử lý ngoại lệ). Tuy nhiên, đăng nhập sẽ là một lý do hợp lệ để bắt được Error s trong mắt tôi.

Giải pháp được đề xuất của tôi là sử dụng uncaught exception handler cho điều này trước setting it as the default exception handler. Trong trình xử lý này, bạn sẽ nhận được tất cả các ngoại lệ và các lỗi, nếu chúng không bị bắt bất cứ nơi nào trong mã, và bạn có thể thử đăng nhập chúng.

+0

Và đối với bất kỳ thắc mắc nào nếu khối 'try-catch' có thể nằm trong khối 'try', bạn có thể có nó. [Mã có liên quan] (http://ideone.com/stN75L). – Prasanth

+1

@Prasanth Chắc chắn, 'try..catch' có thể được ở khắp mọi nơi một tuyên bố bình thường có thể được, điều này bao gồm lồng nhau' try'. Tất nhiên bạn cũng có thể có 'try..catch' bên trong' catch' khác. –

+0

Tôi không hiểu cách thêm khối '' 'try..catch''' giúp nắm bắt các ngoại lệ như vậy. tôi có một trường hợp như vậy, và thêm một 'bên trong' '' 'try - catch''' không giúp ích gì cho trường hợp của tôi. Bạn có thể xây dựng? @Prasanth @Philipp Wendler? –

3

Không có điểm bắt những trường hợp ngoại lệ (lớp con của VirtualMachineError) như bạn không có indecattion trong đó nêu rõ pogram là tại thời điểm này, các saies Doc về Virtual Machine Lỗi:

Một máy ảo Java thực hiện ném một đối tượng là một cá thể của một lớp con của lớp VirtualMethodError khi một lỗi nội bộ hoặc giới hạn tài nguyên ngăn không cho nó triển khai ngữ nghĩa được mô tả trong chương này. Đặc điểm kỹ thuật này không thể dự đoán nơi lỗi nội bộ hoặc giới hạn tài nguyên có thể bị gặp và không ủy quyền chính xác khi chúng có thể được báo cáo.

nên giả sử bạn nhận được trong một OutOfMemoryError hoặc một UnknownError có isnt nhiêu bạn có thể làm gì về nó, và một khi công việc doesnt vritualmashine của bạn đúng cách bạn không thể cung cấp các anyhelp người dùng như isnt chương trình của bạn hoạt động bình thường là tốt, bên cạnh đó bạn có không có ý tưởng về thời gian, điểm, và lý do nó vui vẻ vì nó không phải là một lỗi mã được gây ra từ chương trình của bạn.

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