Tôi đang viết một chương trình chấm điểm cho một bài tập trong đó học sinh đang thực hiện các thuật toán sắp xếp đệ quy. Điều này có nghĩa là một số sinh viên có thể sẽ biến mã bị hỏng gây tràn ngăn xếp. Tôi muốn bằng cách nào đó bắt stack tràn xảy ra khi gọi mã sinh viên để tôi có thể khấu trừ từ điểm số của họ và tiếp tục các bài kiểm tra khác. Thật không may, tràn ngăn xếp dường như không đi qua đường dẫn tiêu chuẩn của các ngoại lệ khác - các khối try/catch dường như không giúp ích gì. Có cách nào để trả lại thực thi cho mã của tôi sau khi xảy ra tràn ngăn xếp không? Tôi đã nhìn vào sử dụng các chủ đề để làm điều này, nhưng nó chỉ có vẻ trở lại để không thể sử dụng try/catch.Làm thế nào để tôi nắm bắt và phục hồi từ tràn ngăn xếp trong Java?
9
A
Trả lời
14
Khi gọi các phương pháp của học sinh, bạn nên nhúng các cuộc gọi trong các khối try-catch và bắt Exception
s là Throwables
.
Xem đoạn mã sau:
public class Test { /** * @param args */ public static void main(String[] args) { try { soe(); } catch (Throwable e) { System.out.println("Caught:" + e + ", everything went better than expected."); } } /** * Method producing StackOverflowError */ public static void soe() { soe(); } }
Thông tin thêm
Khi bắt Throwable
s bạn sẽ bắt:
- Bình thường
Exception
s - mà thực thi bạn sử dụngtry-catch
hoặcthrows
(ví dụ:IOException
) RuntimeException
s - bong bóng thông qua các phương pháp (ví dụ:NullPointerException
)Error
s - ví dụ:StackOverflowError
Xem official Java Docs trên Throwable
đối tượng
2
Bạn có thể kích hoạt chương trình của họ bằng cách sử dụng Process
mới và sau đó chuyển hướng luồng lỗi của nó để kiểm tra tràn ngăn xếp.
+0
Không cần thiết cho điều đó - xem câu trả lời của Matyas bên dưới. –
1
Bạn có thể thử chạy từng chương trình trong một JVM riêng biệt.
Các vấn đề liên quan
- 1. Ngăn xếp tràn từ đệ quy sâu trong Java?
- 2. Làm thế nào để tránh tràn ngăn xếp trong Haskell?
- 3. Làm thế nào để bẫy tràn ngăn xếp với pthread?
- 4. Làm thế nào để tràn ngăn xếp mà không cần đẩy khung ngăn xếp mới?
- 5. C# bắt một ngoại lệ tràn ngăn xếp
- 6. AppDomain.FirstChanceException và ngoại lệ tràn ngăn xếp
- 7. Lỗi tràn ngăn xếp Java - cách tăng kích thước ngăn xếp trong Eclipse?
- 8. Làm thế nào để ngăn chặn tràn ngăn xếp bằng cách theo dõi kích thước ngăn xếp?
- 9. Regex của tôi đang gây ra tràn ngăn xếp trong Java; tôi đang thiếu gì?
- 10. Tôi không hiểu lỗi tràn ngăn xếp với DispatchMessageW lặp lại trong ngăn xếp cuộc gọi
- 11. Android onConfigurationChanged: làm thế nào để lưu và khôi phục lại phân đoạn ngăn xếp?
- 12. Làm thế nào để tôi nắm bắt ngoại lệ vi phạm ràng buộc từ EclipseLink?
- 13. Làm thế nào để sử dụng IO với Scalaz7 Iteratees mà không làm tràn ngăn xếp?
- 14. Ngăn chặn phục hồi Fragment trong Android
- 15. Segfault trên ngăn xếp tràn
- 16. Làm thế nào để nắm bắt đầu ra từ một lệnh từ xa trong Capistrano?
- 17. Làm thế nào để nắm bắt tiếng Hebrew với regex trong Java?
- 18. Làm cách nào để nắm bắt sự kiện "kết thúc phản hồi" trong node.js + express?
- 19. Làm thế nào để nắm bắt đầu ra của printf?
- 20. Lỗi tràn ngăn xếp bảo vệ fread
- 21. Làm thế nào để nắm bắt tín hiệu Control + D?
- 22. Làm thế nào để ngăn chặn tràn bộ đệm memcpy?
- 23. Làm cách nào để nắm bắt SocketExceptions trong MonkeyRunner?
- 24. Ngoại lệ tràn ngăn xếp — tại sao?
- 25. URL ngăn xếp ngăn xếp hoạt động như thế nào?
- 26. Lỗi tràn ngăn xếp trong C# set/get
- 27. tràn trong khôi phục trong android 4.3
- 28. Bắt dấu vết ngăn xếp trong Perl?
- 29. savedInstanceState khi khôi phục đoạn từ ngăn xếp lại
- 30. Làm thế nào để mô phỏng/tạo tràn tràn css-top và tràn-dưới?
Điều này. Lỗi và ngoại lệ là cả hai lớp con của Throwable, đó là lý do lỗi đi qua chế độ Ngoại lệ thông thường. Nó được thiết kế theo cách đó để các lỗi nghiêm trọng (đó là những gì Lỗi trong Java) sẽ không dễ dàng bị phá vỡ bởi các lập trình viên. –
@IbrahimArief: Cảm ơn bạn đã trỏ đến các khái niệm cơ bản. Điều này giúp – Jayy
Tuyệt vời, cảm ơn! – Solaraeus