2010-03-29 34 views
15

Bạn có thể thử/bắt một ngoại lệ tràn ngăn xếp trong java không? Dường như nó cũng đang ném chính nó. Khi thủ tục của tôi tràn, tôi muốn "phạt" giá trị đó.try/catch on stack overflow trong java?

+12

phòng bệnh hơn bắt .... –

+4

bắt rất hữu ích để gỡ lỗi :) – JonnyBoy

Trả lời

22

Dường như làm việc:

public class Test { 

    public static void main(String[] argv){ 
     try{ 
      main(null); 
     } 
     catch(StackOverflowError e){ 
      System.err.println("ouch!"); 
     } 
    } 

} 
+1

Ah tôi đã cố gắng với một ngoại lệ chung. Cảm ơn! – stereos

+0

Tôi đồng ý rằng tìm ra nguyên nhân gây ra ngoại lệ và ngăn chặn nó sẽ tốt hơn. – Thilo

+8

@stereos Bạn không cố gắng nắm bắt 'Ngoại lệ' là bạn? 'Lỗi' mở rộng 'Throwable' trực tiếp, không thông qua' Exception'. –

7

Nếu bạn đang nhận được một chồng tràn, bạn có khả năng cố gắng đệ quy vô hạn hoặc bị lạm dụng nghiêm trọng lời gọi hàm. Có lẽ bạn có thể xem xét thực hiện một số thủ tục lặp lại của bạn thay vì đệ quy hoặc kiểm tra lại rằng bạn có một trường hợp cơ sở chính xác trong thủ tục đệ quy của bạn. Bắt một ngoại lệ tràn ngăn xếp là một ý tưởng tồi; bạn đang điều trị các triệu chứng mà không cần giải quyết nguyên nhân cơ bản.

+0

Trong trường hợp sử dụng đệ quy và tràn của các tùy chọn thiết lập của JVM SO là một câu trả lời tiêu cực bình thường của một chương trình chính xác. Chúng tôi PHẢI bắt nó và phản ứng. Ví dụ, trong trường hợp của trình tự lười biếng, được thiết lập bởi một finction đệ quy (http://stackoverflow.com/a/33926444/715269), chúng tôi chỉ đơn giản là có thể di chuyển trên các bước nhỏ hơn. – Gangnus

+1

Bắt lỗi SO cũng hữu ích cho việc gỡ lỗi khi bạn không biết một trong nhiều phương pháp đệ quy nào gây ra lỗi SO :) –

0

Tôi đồng ý với Michael - StackOverflowException là tín hiệu cho thấy có điều gì đó rất sai. Nuốt nó không phải là một ý tưởng hay. Các hành động tốt nhất là để sửa chữa nguyên nhân gốc rễ của lỗi này.

+0

Câu hỏi mà người này muốn nuốt ở đâu? Ngược lại, anh ta muốn "phạt giá trị" – Gangnus

+0

Sự hiểu biết của tôi là OP muốn bắt StackOverflowException để cung cấp một số logic tùy chỉnh (phạt) khi xử lý ngoại lệ. Và, chúng ta trở lại hình vuông là "Một sẽ không bắt lỗi". –

+0

Và tôi lại lặp lại: Trong trường hợp sử dụng đệ quy SO có ý nghĩa hoàn toàn khác: bạn đã nhảy quá sâu, lặp lại nó phân chia theo các bước nông cạn hơn. – Gangnus

4

Bạn phải nắm bắt lỗi, không phải ngoại lệ

2

Các tính năng chức năng của Java 8 khiến câu hỏi này trở nên quan trọng hơn. Trong khi chúng ta bắt đầu sử dụng đệ quy ồ ạt, StackOverflowException là thứ mà chúng ta phải tính.

Các loại lambda Java 8 không có một trong số chúng ném StackOverflowException. Vì vậy, chúng ta phải tạo ra như vậy. Nó là hoàn toàn cần thiết, mà không có rằng chúng tôi sẽ không vượt qua ngay cả việc kiểm soát IDE.

Ví dụ, Integer -> Integer chức năng loại có thể nhìn như:

@FunctionalInterface 
public interface SoFunction <U> { 
    public U apply(Integer index) throws StackOverflowException; 
} 

Sau đó chúng tôi có thể viết một hàm mà sẽ chấp nhận lambdas ném StackOverflowException.

public T get(int currentIndex) throws StackOverflowException{ 

Và chỉ bây giờ chúng ta có thể tạo ra một lambda đệ quy:

fiboSequence.setSequenceFunction(
      (i) -> 
      fiboSequence.get(i-2).add(fiboSequence.get(i-1)) 
); 

Sau đó chúng ta có thể gọi là chuỗi đệ quy fiboSequence.get(i) và nhận được một kết quả hoặc một StackOverflowException nếu toàn bộ dây chuyền là không thể tính được.

Trong trường hợp sử dụng đệ quy SO có ý nghĩa hoàn toàn khác: bạn đã nhảy quá sâu, lặp lại nó chia theo các bước nông cạn hơn.

1

Đây là giải pháp của tôi,

public class TryExample { 

    public static void main(String[] args){ 
     try { 
      int no=10/0; 
     } catch (Exception e) { 
      System.err.println("Arithmetic Exception occurs!"); 
     } 
    } 
} 
+0

Giải pháp của bạn cho một cái gì đó đã được trả lời cách đây vài năm với một cách thích hợp? Bạn nhận ra rằng việc bắt được 'Ngoại lệ' là những gì OP đã thử và rõ ràng là không hiệu quả? – Tom

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