2012-02-16 37 views
9

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?

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ụng try-catch hoặc throws (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

+1

Đ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. –

+0

@IbrahimArief: Cảm ơn bạn đã trỏ đến các khái niệm cơ bản. Điều này giúp – Jayy

+0

Tuyệt vời, cảm ơn! – Solaraeus

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