2010-05-29 21 views
7


Như tiêu đề gợi ý, làm thế nào tôi có thể nói một JVM ném ngoại lệ từ một lập trình (thực hiện điều này có nghĩa là, ném bởi một lập trình viên hoặc chương trình) ném ngoại lệ?Làm thế nào để phân biệt giữa Programmer và JVM Exceptions


Exceptions JVM


1) ArrayIndexOutOfBoundsException

2) ClassCastException

3) NullPointerExc eption



lập trình ném


1) NumberFormatException

2) AssertionError


Nhiều Cảm ơn

Trả lời

4

Tôi không chắc chắn những gì bạn có nghĩa là bởi ngoại lệ JVM. Đây là tất cả các ngoại lệ thời gian chạy có thể được lập trình viên ném vào bất kỳ lúc nào (ngoại lệ AssertionError), mặc dù nó được coi là kiểu kém để ném một số ngoại lệ nhất định như NullPointerException. Vấn đề là, không có chất lượng nào tách hai loại mà bạn đề cập khác với cách sử dụng thông thường của chúng. Tất cả các ngoại lệ thời gian chạy mở rộng, trực tiếp hoặc gián tiếp, RuntimeException.

Từ JavaDocs cho Throwable:

Chỉ

đối tượng là các trường hợp của lớp này (hoặc một trong các lớp con của nó) được ném bởi Java Virtual Machine hoặc có thể được ném ra bởi Java ném tuyên bố.

Vì cùng một lớp cha này xác định tất cả ngoại lệ do JVM hoặc lập trình viên đưa ra, bạn không thể dễ dàng phân biệt hai trường hợp này.

+0

Ngoại lệ JVM Các trường hợp ngoại lệ hoặc lỗi đó là độc quyền hoặc được JVM ném một cách hợp lý nhất. Ngoại lệ có lập trình Những trường hợp ngoại lệ được ném rõ ràng bởi ứng dụng và/hoặc lập trình viên API. – Haxed

+0

@Haxed: Vấn đề là lập trình viên rất rõ ràng có thể ném bất kỳ ngoại lệ nào (ngoại trừ AssertionError). Vì vậy, bạn không thể làm những gì bạn muốn làm. – NotMe

+0

@Chris: AssertionError là Throwable, tôi chỉ làm rõ rằng nó không phải là một RuntimeException giống như những người khác. –

3

Tôi không nghĩ rằng bạn sẽ tìm thấy một danh sách đầy đủ, vì không có sự phân biệt rõ ràng giữa JVM và ngoại lệ lập trình viên khởi xướng, ngoài một vài trường hợp đặc biệt:

  • nhất Error lớp được ném bởi VM , do nguyên nhân bên trong hoặc bên ngoài. Một ThreadDeath ngoại lệ, được ném vào một thread khi thread đó bị dừng lại, và là một loại "hack" để làm cho thread giải phóng nó là stack và thoát.
  • ngoại lệ được kiểm tra nhiều nhất liên quan đến các vấn đề môi trường dẫn đến thất bại của một số thao tác, nhưng có thể giải quyết được và không gây tử vong cho JVM (IOException, SQLException, RemoteException).
  • phần còn lại, các ngoại lệ không được kiểm soát, là sự kết hợp của cả ngoại lệ bắt đầu từ jvm và lập trình viên. Ví dụ, JDK ném IllegalArgumentException khi các tham số của phương thức không phải là spec. Đó có phải là ngoại lệ JVM hoặc ngoại lệ có lập trình không? Nó không rõ ràng nếu định nghĩa của bạn về ngoại lệ JVM bao gồm JDK hay không. ArrayIndexOutOfBounds được tạo cho các truy cập mảng bất hợp pháp, được tạo ra bởi JVM, nhưng nó cũng bị ném vào một số apis, ví dụ: Track.get từ java.midi. (Mặc dù điều này có thể được lập luận là hình thức nghèo nàn, và siêu lớp IndexOutOfBounds lẽ ra phải được sử dụng thay thế.)
5

Bạn không thể làm điều này một cách tĩnh bởi vì không có sự phân biệt như vậy.

Bất kỳ ngoại lệ nào được xác định trong thư viện lớp chuẩn Java có thể được ném bởi ứng dụng hoặc mã thư viện của bên thứ ba. Trong một số trường hợp, đó là một ý tưởng xấu (hoặc thậm chí khủng khiếp) để ném một ngoại lệ tiêu chuẩn, nhưng ở những người khác, đó là điều được khuyến khích để làm.

Cách duy nhất để phân biệt giữa ngoại lệ được JVM đưa ra và mã ứng dụng là kiểm tra khung ngăn xếp từ ngoại lệ được ném để tìm ra lớp nào đã loại trừ ngoại lệ. (Nói đúng ra không nói cho bạn biết nơi ngoại lệ được ném ... nhưng nó đủ gần để cho rằng các trường hợp ngoại lệ gần như luôn được khởi tạo và ném vào cùng một tuyên bố.)

Nhưng ngay cả điều này cũng không phải là một điều đặc biệt hữu ích làm. Tôi có nghĩa là, sự khác biệt ngữ nghĩa giữa một ngoại lệ được ném bởi mã ứng dụng và thư viện lớp là gì? Nó chắc chắn không nói bất cứ điều gì về nguyên nhân gốc rễ của vấn đề.

+0

Điều này không phải lúc nào cũng đúng. Trong khi nói những gì ném jvm là khó khăn, nó là khá dễ dàng để nói những gì rõ ràng là một lỗi trình biên dịch. Xem mdma cho một ví dụ tốt. Trường hợp ngoại lệ được kiểm tra tồn tại chỉ trong trường hợp ngoại lệ và phải được bắt hoặc ném hoặc trình biên dịch sẽ thất bại (IOException, ReflectiveOperationException, FontFormatException, CloneNotSupportedException, RemoteException; bao gồm cả các lớp con của chúng). –

+0

@AndrewScottEvans - Tôi xin lỗi nhưng nhận xét của bạn không có ý nghĩa gì đối với tôi. Yea, chắc chắn chúng ta đều biết sự khác biệt giữa các trường hợp ngoại lệ được kiểm tra và không được kiểm tra, và các ngoại lệ đã kiểm tra đó phải được bắt hoặc khai báo là 'ném'. Nhưng kiểm tra vs bỏ chọn không phải là sự phân biệt mà câu hỏi đang cố gắng thực hiện. –

+0

Đây thực sự là những gì bạn đang yêu cầu. Cách tốt nhất để nói những gì được ném bởi lập trình viên là với các ngoại lệ thời gian biên dịch đã được kiểm tra. Chúng phải luôn được ném theo chương trình, một cách rõ ràng. Các ngoại lệ và lỗi JVM được ném vào thời gian chạy. Hầu hết tồn tại trong thời gian chạy và TẤT CẢ được bỏ chọn. Tôi khuyên bạn nên đọc sách hướng dẫn hoặc tài liệu nghiên cứu thử nghiệm SE7 I. Nó sẽ giúp. –

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