2009-05-08 64 views
8

Trường hợp ngoại lệ được lưu trữ ở đâu? Stack, Heap. Bộ nhớ được phân bổ và deallocated cho các ngoại lệ như thế nào? Bây giờ nếu bạn có nhiều hơn một ngoại lệ cần được xử lý thì có các đối tượng của tất cả các ngoại lệ này được tạo ra không?Ngoại lệ Java và Ngoại lệ C++

+0

Ngoài ra, tôi muốn biết là Ngoại lệ trong C++ và Java đã xử lý các biện pháp tương tự hoặc bổ sung phải được thực hiện? – Thunderboltz

+1

Dường như người dùng trả lời bạn mà không nhắc đến là họ đề cập đến Java hoặc C++. Mặt khác, bạn hỏi cái nào? –

+1

Lần đầu tiên anh ta hỏi về Java, C++ đến sau ... – Thilo

Trả lời

7

Tôi giả định rằng bộ nhớ cho các ngoại lệ được phân bổ theo cùng một cách như đối với tất cả các đối tượng khác (trên heap).

Điều này từng là một vấn đề, bởi vì sau đó bạn không thể cấp phát bộ nhớ cho OutOfMemoryError, đó là lý do tại sao có no stack trace until Java 1.6. Giờ đây, họ cũng phân bổ không gian cho stacktrace.

Nếu bạn đang tự hỏi nơi tham chiếu đến ngoại lệ được lưu trữ trong khi nó đang được ném, JVM giữ tham chiếu nội bộ trong khi nó bung ngăn xếp cuộc gọi để tìm trình xử lý ngoại lệ, sau đó nhận tham chiếu (trên stack frame, giống như bất kỳ biến cục bộ nào khác).

Không thể có hai ngoại lệ được ném cùng một lúc (trên cùng một chuỗi). Chúng có thể được lồng nhau, nhưng sau đó bạn chỉ có một ngoại lệ "hoạt động" với tham chiếu đến ngoại lệ lồng nhau.

Khi tất cả các tham chiếu đến ngoại lệ biến mất (ví dụ: sau khi trình xử lý ngoại lệ kết thúc), ngoại lệ sẽ được thu thập rác như mọi thứ khác.

+0

nếu bạn định vị nó trong phân khúc ngăn xếp hoặc phân đoạn dữ liệu, bạn sẽ tìm thấy ở đâu? – Thunderboltz

+0

Có gì với C++? – tuergeist

+0

Tôi không biết gì về C++. Đầu tiên anh ta hỏi về Java chỉ, C++ đến sau .. – Thilo

1

Ngoại lệ trong Java là các đối tượng và như vậy, chúng được lưu trữ trên heap.

Khi ngoại lệ được ném, JVM sẽ tìm trình xử lý ngoại lệ phù hợp trong mã. Điều này áp dụng ngay cả khi có nhiều ngoại lệ mà một cái gì đó có thể ném.

1

Trường hợp ngoại lệ được lưu trữ ở đâu? Ngăn xếp, Heap. Bộ nhớ được phân bổ như thế nào và được phân bổ cho Ngoại lệ như thế nào?

Trường hợp ngoại lệ là các đối tượng như bất kỳ ai khác trong lĩnh vực này. Phân bổ trên heap thông qua new, deallocated bởi các bộ thu rác.

Bây giờ nếu bạn có nhiều hơn một ngoại lệ mà cần phải được xử lý đang có đối tượng của tất cả các trường hợp ngoại lệ tạo?

Không chắc chắn ý của bạn là gì. Chúng được tạo thông qua new, mỗi lần một. Có thể có nhiều hơn một xung quanh khi bạn sử dụng chuỗi ngoại lệ - và thực sự không có gì ngăn cản bạn tạo hàng nghìn ngoại lệ và đưa chúng vào Danh sách ở đâu đó - nó không có ý nghĩa nhiều.

2

Để biết thông tin đầy đủ nhất về ngoại lệ, chúng tôi có thể truy cập trực tiếp vào nguồn: Chapter 11: Exceptions của The Java Language Specification, Second Edition.

Trường hợp ngoại lệ thực sự là đối tượng.Họ là một lớp con của Throwable:

Mỗi ngoại lệ được đại diện bởi một thể hiện của lớp Throwable hoặc một của lớp con của nó; một đối tượng như vậy có thể sử dụng để mang thông tin từ điểm mà tại đó ngoại lệ xảy ra với trình xử lý bắt giữ nó.

Do đó, có thể sẽ an toàn để giả định, giống như bất kỳ Object trong Java, nó sẽ được cấp phát trên heap.

Trong điều kiện có mulitple Exception đối tượng, có thể sẽ không xảy ra, như một khi ngoại lệ xảy ra, Máy ảo Java sẽ bắt đầu tìm một trình xử lý ngoại lệ.

Trong quá trình ném một ngoại lệ, các máy ảo Java đột ngột hoàn tất, từng người một, bất kỳ biểu, báo cáo, phương pháp và constructor lời gọi, initializers, và lĩnh vực biểu thức khởi tạo rằng đã bắt đầu nhưng chưa hoàn thành việc thực hiện trong chuỗi hiện tại. Quy trình này tiếp tục cho đến khi người xử lý là phát hiện thấy rằng nó xử lý ngoại lệ cụ thể đó bằng cách đặt tên là loại ngoại lệ hoặc siêu lớp của lớp học ngoại lệ.

Để biết thêm thông tin về cách xử lý ngoại lệ khi chạy, Section 11.3 Handling of an Exception có các chi tiết.

4

Đối với C++, nó không được xác định nơi lưu trữ ngoại lệ, nhưng hầu hết các trình biên dịch đều sử dụng ngăn xếp đặc biệt. Đối với Java như ai đó đã viết trước đó, chúng được lưu trữ trên heap.

Vì ngoại lệ là các đối tượng trong C++ cũng như trong Java, chúng được phân bổ và deallocated như các đối tượng trong ngôn ngữ cụ thể.

Chỉ có một ngoại lệ hoạt động cho mỗi chuỗi trong cả hai ngôn ngữ.

+0

vì vậy bạn có nghĩa là để nói, nếu tôi làm một "ngoại lệ mới" thì nó được lưu trữ trong "ngăn xếp đặc biệt". Bây giờ, toán tử mới phân biệt giữa ngăn xếp nào để sử dụng khi nào? Nó có xử lý các trường hợp đặc biệt không? – Thunderboltz

+0

Câu hỏi đặt ra là, trình biên dịch đánh giá một đối tượng như một ngoại lệ và cung cấp mã máy thích hợp như thế nào. Những gì tôi muốn nói là, các nhà điều hành mới không phải phân biệt ... – tuergeist

+0

Bằng cách này, không bỏ lỡ lưu ý: "Đối với C++ nó không được xác định nơi lưu trữ ngoại lệ"! – tuergeist

1

Trong Java, Ngoại lệ mở rộng Có thể ném kéo dài đối tượng. tức là từ một điểm bộ nhớ, xem một đối tượng giống như bất kỳ đối tượng nào khác.

Đã được đề xuất trong Java 7 rằng các biến cục bộ có thể được đặt trên ngăn xếp bằng cách sử dụng phân tích thoát để tìm các ứng cử viên cho các biến ngăn xếp. Tuy nhiên, các ngoại lệ thường được ném từ một phương thức đến một người gọi (hoặc người gọi của nó, vv) vì vậy sẽ không có ích gì khi đặt ngoại lệ lên ngăn xếp.