जैसा कि पहले ही उत्तर दिया गया है , कोड को निष्पादित करना संभव है, और विशेष रूप से फ़ंक्शन को कॉल करने के लिए, StackOverflowError
क्योंकि जेवीएम के सामान्य अपवाद से निपटने की प्रक्रिया पकड़ throw
और catch
बिंदुओं के बीच स्टैक को खोलती है , आपके उपयोग के लिए स्टैक-स्पेस को मुक्त करती है। और आपका प्रयोग इस बात की पुष्टि करता है कि मामला क्या है।
हालांकि, यह कहने के लिए बिल्कुल समान नहीं है कि यह सामान्य रूप से, एक से उबरने के लिए संभव है StackOverflowError
।
एक StackOverflowError
IS-A VirtualMachineError
, जो IS-AN है Error
। जैसा कि आप बताते हैं, जावा एक के लिए कुछ अस्पष्ट सलाह देता है Error
:
गंभीर समस्याओं को इंगित करता है कि एक उचित अनुप्रयोग को पकड़ने की कोशिश नहीं करनी चाहिए
और आप यथोचित रूप से यह निष्कर्ष निकालते हैं कि कुछ परिस्थितियों में ओके को पकड़ने जैसा लगना चाहिएError
। ध्यान दें कि एक प्रयोग करने से यह प्रदर्शित नहीं होता है कि कुछ सामान्य रूप से करना सुरक्षित है। केवल जावा भाषा के नियम और आपके द्वारा उपयोग की जाने वाली कक्षाओं के विनिर्देश ही ऐसा कर सकते हैं। ए VirtualMachineError
अपवाद का एक विशेष वर्ग है, क्योंकि जावा लैंग्वेज स्पेसिफिकेशन और जावा वर्चुअल मशीन स्पेसिफिकेशन इस अपवाद के शब्दार्थ के बारे में जानकारी प्रदान करते हैं। विशेष रूप से, बाद वाला कहता है :
जावा वर्चुअल मशीन कार्यान्वयन एक ऐसी वस्तु को फेंकता है जो कक्षा के एक उपवर्ग का एक उदाहरण है VirtualMethodError
जब एक आंतरिक त्रुटि या संसाधन सीमा इसे इस अध्याय में वर्णित शब्दार्थ को लागू करने से रोकती है। यह विनिर्देश यह अनुमान नहीं लगा सकता है कि आंतरिक त्रुटियां या संसाधन सीमाएँ कहाँ हो सकती हैं और रिपोर्ट किए जाने पर वे ठीक से शासित नहीं होती हैं। इस प्रकार, VirtualMethodError
नीचे दिए गए किसी भी उपवर्ग को जावा वर्चुअल मशीन के संचालन के दौरान किसी भी समय फेंक दिया जा सकता है:
...
StackOverflowError
: जावा वर्चुअल मशीन कार्यान्वयन एक थ्रेड के लिए स्टैक स्पेस से बाहर चला गया है, आमतौर पर क्योंकि थ्रेड निष्पादन प्रोग्राम में एक गलती के परिणामस्वरूप पुनरावर्ती इनवॉइस की अनबाउंड संख्या कर रहा है।
महत्वपूर्ण समस्या यह है कि आप "भविष्यवाणी नहीं कर सकते" कहाँ या कब StackOverflowError
फेंके जाएंगे। हैं कोई गारंटी जहां यह फेंक दिया नहीं किया जाएगा के बारे में। आप इस पर भरोसा नहीं कर सकते हैं कि उदाहरण के लिए, एक विधि में प्रवेश किया जा रहा है । इसे एक विधि के भीतर एक बिंदु पर फेंका जा सकता है ।
यह अप्रत्याशितता संभावित रूप से विनाशकारी है। जैसा कि इसे एक विधि के भीतर फेंका जा सकता है, इसे संचालन के एक अनुक्रम के माध्यम से भाग दिया जा सकता है जिसे वर्ग एक "परमाणु" ऑपरेशन मानता है, वस्तु को आंशिक रूप से संशोधित, असंगत, राज्य में छोड़ देता है। असंगत स्थिति में ऑब्जेक्ट के साथ, उस ऑब्जेक्ट का उपयोग करने का कोई भी प्रयास गलत व्यवहार के परिणामस्वरूप हो सकता है। सभी व्यावहारिक मामलों में आप यह नहीं जान सकते हैं कि कौन सी वस्तु असंगत स्थिति में है, इसलिए आपको यह मानना होगा कि कोई भी वस्तु विश्वसनीय नहीं है। किसी भी पुनर्प्राप्ति ऑपरेशन या अपवाद के पकड़े जाने के बाद जारी रखने का प्रयास इसलिए गलत व्यवहार हो सकता है। इसलिए केवल सुरक्षित चीज को पकड़ना नहीं हैStackOverflowError
, बल्कि कार्यक्रम को समाप्त करने की अनुमति देने के लिए। (व्यवहार में आप समस्या निवारण में सहायता करने के लिए कुछ त्रुटि लॉगिंग करने का प्रयास कर सकते हैं, लेकिन आप उस लॉगिंग को सही तरीके से संचालित करने पर भरोसा नहीं कर सकते हैं )। यही है, आप मज़बूती से एक से उबर नहीं सकतेStackOverflowError
।