2010-01-28 40 views
10

मैं अतिप्रवाह और जावा में अधःप्रवाह अपवाद की एक पकड़ पाने के लिए कोशिश कर रहा हूँ, लेकिन किसी भी अच्छा ट्यूटोरियल नहीं मिल सका। विशेष रूप से मैं सीखना चाहता हूंआम अधःप्रवाह और अतिप्रवाह अपवाद

  1. वे एक दूसरे से अलग कैसे हैं?
  2. इन अपवादों की उपवर्गों क्या हैं?
  3. किस परिदृश्य में उन्हें फेंक दिया जाता है?
  4. उनमें से कौन सा संभाला जा सकता है और कैसे?
  5. उनसे संबंधित सर्वोत्तम अभ्यास क्या हैं?

उपयोगी ट्यूटोरियल करने के लिए किसी भी लिंक

+0

डाउनवोट के लिए धन्यवाद, किसी भी कारण से? क्या यह नकल, अप्रासंगिक, विकृत है ..? –

+2

मैं वह व्यक्ति नहीं था जिसने आपको कम किया था, लेकिन, किस प्रकार का अतिप्रवाह/अंडरफ्लो आप बात कर रहे हैं? अंकगणित? ढेर? कुछ और? –

+0

मैं अपवाद के इन दो वर्गों पर हेडस्टार्ट प्राप्त करना चाहता हूं। कोई भी और सभी मेरे लिए उपयोगी होंगे –

उत्तर

25

ठीक है, ओपी दोनों ढेर अतिप्रवाह और गणित अतिप्रवाह, साथ ही उनकी संगत अधःप्रवाह के बारे में जानने की चाह के बारे में बात की थी। यहां जाता है ....

  1. अंकगणित अतिप्रवाह तब होता है जब कोई संख्या उसके मूल्य प्रकार में फिट होने के लिए बहुत बड़ी हो जाती है। उदाहरण के लिए, एक int के बीच -2 और 2 -1, समावेशी मान रखती है। यदि आपकी संख्या इन सीमाओं पर जाती है, तो एक ओवरफ्लो होता है, और संख्या "चारों ओर लपेटती है"। ये जावा में उत्पन्न होने का अपवाद नहीं पैदा करते हैं।
  2. अंकगणित अंडरफ्लो तब होता है जब एक फ़्लोटिंग पॉइंट नंबर शून्य से बहुत अच्छी तरह से अंतर करने के लिए बहुत छोटा हो जाता है (संख्या की सटीकता को छोटा कर दिया जाता है)। जावा में, इन्हें अपवाद भी नहीं होता है।
  3. स्टैक ओवरफ़्लो होता है जब आप कोई फ़ंक्शन कॉल करते हैं, जो कि किसी अन्य फ़ंक्शन को कॉल करता है, फिर उसे कॉल करता है, फिर दूसरा ... और फ़ंक्शन कॉल स्टैक बहुत गहरा हो जाता है। जब ऐसा होता है तो आपको StackOverflowError मिलता है।
  4. ढेर अधःप्रवाह जावा में नहीं होता है। इसकी रनटाइम प्रणाली उस तरह की चीजों को होने से रोकने के लिए माना जाता है।

ओपी के अन्य प्रश्न (टिप्पणियां देखें) का उत्तर देने के लिए, जब आप किसी सरणी की सीमाओं को पार करते हैं, तो IndexOutOfBoundsException जारी किया जाता है।

+0

+1 स्पष्ट स्पष्टीकरण। मैंने int.MIN_VALUE से एक अंडरफ्लो नामक भी घटाया है। मैं पहले आपके बिंदु 2 में नहीं आया है। – Paolo

+1

@ पाओलो: मुझे लगता है कि 'Integer.MIN_VALUE' से एक को घटाना भी अतिप्रवाह माना जाता है। लेकिन शायद मैं यहाँ बाल बांट रहा हूँ। :-) –

+0

@ क्रिस धन्यवाद, यह मदद करता है, मैं इस सामान के लिए दस्तावेज कहां प्राप्त कर सकता हूं? –

6

करना होगा जावा गणित, अतिप्रवाह या underflow में कभी नहीं एक अपवाद फेंक देते हैं। इसके बजाए, फ्लोटिंग पॉइंट अंकगणितीय के लिए मान Not a number, 'अनंत' या शून्य के रूप में सेट किया गया है।

इनके परीक्षण के लिए आप स्थिर विधियों का उपयोग करके स्थिर विधियों का उपयोग कर सकते हैं: isNaN या isInfinite। आप इसे उचित के रूप में संभाल सकते हैं। उदाहरण:

double d1 = 100/0.; 
if (Double.isNaN(d1)) { 
    throw new RuntimeException("d1 is not a number"); 
} 
if (Double.isInfinite(d1)) { 
    throw new RuntimeException("d1 is infinite"); 
} 

निश्चित संचालनों के लिए आप एक ArithmeticException प्राप्त कर सकते हैं, उदाहरण के लिए जब dividing by zero पूर्णांक गणित में।

मैं सिर्फ एक पूरी परियोजना शैली तरीका यह संभाल करने के बारे में related question पूछा।

+0

-1 100/0 वास्तव में अनंतता देता है, न कि ना। इसके अलावा, एक गणित अधःप्रवाह (denormal) सिर्फ रिटर्न 0. –

+0

धन्यवाद, मैं BufferOverflowException और BufferUnderflowException और संबंधित सामान –

+1

@Ravi गुप्ता की तरह अपवाद के बारे में कलाकृतियां हूँ - कि जोड़ने कृपया मुख्य सवाल का - 'BufferOverflowException' और' BufferUnderflowException' एक बहुत है आपके मूल अस्पष्ट "ओवरफ्लो और अंडरफ्लो अपवाद" प्रश्न से अधिक विशिष्ट। – Nate

0

जावा में कोई हस्ताक्षरित पूर्णांक नहीं है। यदि आपको लगता है कि यह उपयोगी हो सकता है, तो यह अपवाद को फेंकना आसान बनाता है।

public class Counter 
{ 
    private int counter = 0; 

    public int increment() 
    { 
    counter += 1; 
    if (counter < 0) 
     throw new RuntimeException ("Counter overflow"); 
    else 
     return counter; 
    } 

    public String toString() { return String.valueOf(counter); } 
} 
संबंधित मुद्दे