2010-03-29 12 views
15

क्या आप जावा में स्टैक ओवरफ़्लो अपवाद को आजमा सकते हैं/पकड़ सकते हैं? ऐसा लगता है कि यह किसी भी तरह से फेंक रहा है। जब मेरी प्रक्रियाएं बहती हैं, तो मैं उस मान को "दंडित करना" चाहता हूं।जावा में ढेर ओवरफ्लो पर कोशिश/पकड़ो?

public class Test { 

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

} 
+12

रोकथाम को पकड़ने से बेहतर है .... –

+4

पकड़ने डीबगिंग के लिए उपयोगी है :) – JonnyBoy

उत्तर

22

काम करने के लिए लगता है। शायद आप अपनी कुछ प्रक्रियाओं को रिकर्सिव या दोबारा जांचने के बजाय पुनरावर्तक बनाने पर विचार कर सकते हैं कि आपके रिकर्सिव प्रक्रिया में सही आधार मामला है। एक ढेर ओवरफ्लो अपवाद पकड़ना एक बुरा विचार है; आप अंतर्निहित कारण को संबोधित किए बिना लक्षणों का इलाज कर रहे हैं।

+1

आह मैं एक सामान्य अपवाद के साथ कोशिश कर रहा था। धन्यवाद! – stereos

+0

मैं मानता हूं कि अपवाद पैदा करने और इसे रोकने से बेहतर होगा हालांकि यह बेहतर होगा। – Thilo

+8

@stereos आप 'अपवाद' पकड़ने की कोशिश नहीं कर रहे थे क्या आप थे? 'त्रुटि' 'थ्रॉरेबल 'को सीधे बढ़ाती है, न कि' अपवाद 'के माध्यम से। –

7

आप एक ढेर अतिप्रवाह मिल रहे हैं, आप की संभावना अनंत प्रत्यावर्तन प्रयास कर रहे हैं या गंभीर रूप से समारोह आमंत्रण का दुरुपयोग करते हैं:

+0

JVM के सेट विकल्पों के रिकर्सन और ओवरफ़्लो के उपयोग के मामले में SO एक सही प्रोग्राम का सामान्य नकारात्मक उत्तर है। हमें इसे पकड़ना चाहिए और प्रतिक्रिया देना चाहिए। उदाहरण के लिए, आलसी अनुक्रम के मामले में, एक पुनरावर्ती समापन (http://stackoverflow.com/a/33926444/715269) द्वारा सेट किया गया है, हम बस छोटे चरणों से आगे बढ़ सकते हैं। – Gangnus

+1

एसओ त्रुटि को पकड़ना डीबगिंग के लिए भी उपयोगी है जब आप नहीं जानते कि कई रिकर्सिव विधियों में से कौन सी एसओ त्रुटि उत्पन्न कर रहा है :) –

0

मैं माइकल के साथ सहमत हूं - स्टैक ओवरव्लो एक्सेप्शन एक संकेत है कि कुछ गलत हो गया। इसे निगलना एक अच्छा विचार नहीं है। कार्रवाई का सबसे अच्छा तरीका इस त्रुटि के मूल कारण को ठीक करना है।

+0

जहां प्रश्नकर्ता कहता है कि वह निगलना चाहता है? इसके विपरीत, वह "मूल्य को दंडित करने" के लिए vants " – Gangnus

+0

मेरी समझ यह है कि ओपी अपवाद को संसाधित करते समय कुछ कस्टम तर्क (दंडित) प्रदान करने के लिए StackOverflowException को पकड़ना चाहता है। और, हम वापस वर्ग के लिए वापस आ गए हैं जो "कोई त्रुटियों को पकड़ नहीं पाएगा"। –

+0

और मैं फिर से दोहरा रहा हूं: रिकर्सन के उपयोग के मामले में SO को बिल्कुल अलग अर्थ मिलता है: आप बहुत गहरे कूद गए हैं, इसे अधिक उथले कदमों में विभाजित कर दोहराएं। – Gangnus

4

आपको एक त्रुटि, नहीं अपवाद

2

जावा 8 के कार्यात्मक सुविधाओं इस सवाल का अतुलनीय अधिक महत्वपूर्ण बनाता है पकड़ने के लिए की है। जब तक हम बड़े पैमाने पर रिकर्सन का उपयोग करना शुरू करते हैं, तब स्टैक ओवरफ्लो एक्सेप्शन कुछ ऐसा है जिसे हमें गिनना चाहिए।

जावा 8 लैम्ब्डा प्रकारों में से कोई भी नहीं है जो StackOverflowException फेंकता है। तो, हमें ऐसा बनाना है। यह बिल्कुल जरूरी है, इसके बिना हम आईडीई नियंत्रण भी पारित नहीं करेंगे।

उदाहरण के लिए, पूर्णांक -> पूर्णांक समारोह प्रकार के रूप में दे सकता है:

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

उसके बाद हम एक समारोह lambdas फेंकने StackOverflowException को स्वीकार करेंगे कि लिख सकते हैं।

public T get(int currentIndex) throws StackOverflowException{ 

और केवल अब हम एक पुनरावर्ती लैम्ब्डा बना सकते हैं:

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

उसके बाद हम पुनरावर्ती श्रृंखला fiboSequence.get(i) फोन और एक परिणाम या एक StackOverflowException प्राप्त करता है, तो पूरी श्रृंखला बेशुमार था कर सकते हैं।

रिकर्सन के उपयोग के मामले में SO को बिल्कुल अलग अर्थ मिलता है: आप बहुत गहरे कूद गए हैं, इसे अधिक उथले कदमों में विभाजित कर दोहराएं।

1

यहाँ मेरी समाधान है,

public class TryExample { 

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

कुछ ऐसे समाधानों के लिए आपका समाधान जो कई वर्षों पहले उचित तरीके से उत्तर दिया गया है? आपको एहसास है कि 'अपवाद' को पकड़ना क्या ओपी पहले से ही कोशिश कर रहा है और स्पष्ट रूप से काम नहीं करता है? – Tom

संबंधित मुद्दे