क्या कारण हैं ArrayIndexOutOfBoundsException
?
यदि आप एक "बॉक्स" के रूप में एक चर के बारे में सोचते हैं जहां आप एक मूल्य रख सकते हैं, तो एक सरणी प्रत्येक अभिभावक के बगल में रखी गई बक्से की एक श्रृंखला है, जहां बक्से की संख्या एक परिमित और स्पष्ट पूर्णांक है।
इस तरह एक सरणी बनाना:
final int[] myArray = new int[5]
5 बक्से की एक पंक्ति बनाता है, प्रत्येक एक पकड़े int
। प्रत्येक बक्से में एक सूचकांक होता है, बक्से की श्रृंखला में एक स्थिति। यह सूचकांक 0 से शुरू होता है, और एन -1 पर समाप्त होता है, जहां एन सरणी का आकार (बक्से की संख्या) है।
बक्से की इस श्रृंखला से किसी एक मान को पुनः प्राप्त करने के लिए, आप इसे इसके सूचकांक के माध्यम से संदर्भित कर सकते हैं, जैसे:
myArray[3]
जो आपको श्रृंखला में चौथे बॉक्स का मूल्य देगा (चूंकि पहले बॉक्स में सूचकांक 0 है)।
एक ArrayIndexOutOfBoundsException
"बॉक्स" को वापस लेने की कोशिश करने के कारण होता है जो मौजूद नहीं है, एक इंडेक्स पास करने से जो पिछले "बॉक्स" के सूचकांक से अधिक है, या नकारात्मक है।
मेरे चल रहे उदाहरण के साथ, ये कोड स्निपेट ऐसा अपवाद उत्पन्न करेंगे:
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
कैसे बचें ArrayIndexOutOfBoundsException
रोकने के लिए ArrayIndexOutOfBoundsException
, विचार करने के लिए कुछ प्रमुख बिंदु हैं:
लूपिंग
जब एक सरणी के माध्यम से लूपिंग करते हैं, तो हमेशा सुनिश्चित करें कि आप जो इंडेक्स प्राप्त कर रहे हैं वह सरणी की लंबाई (बक्से की संख्या) से कड़ाई से छोटा है। उदाहरण के लिए:
for (int i = 0; i < myArray.length; i++) {
नोटिस <
, =
वहाँ में एक मिश्रण कभी नहीं ..
आप इस तरह से कुछ करने के लिए लुभा सकते हैं:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
बस नहीं है। ऊपर वाले से चिपके रहें (यदि आपको सूचकांक का उपयोग करने की आवश्यकता है) और यह आपको बहुत दर्द से बचाएगा।
जहां संभव हो, फॉरच का उपयोग करें:
for (int value : myArray) {
इस तरह से आपको इंडेक्स के बारे में बिल्कुल नहीं सोचना पड़ेगा।
जब आप कुछ भी करते हैं तो लूपिंग, लूप इटरेटर का मान बदल देते हैं (यहाँ:) i
। यह एकमात्र स्थान होना चाहिए जिसमें मूल्य बदलना चाहिए, लूप को चालू रखना है। इसे बदलना अन्यथा केवल एक अपवाद है, और ज्यादातर मामलों में परिवादात्मक नहीं है।
पुनर्प्राप्ति / अद्यतन
सरणी का एक मनमाना तत्व प्राप्त करते समय, हमेशा जांचें कि यह सरणी की लंबाई के विरुद्ध एक वैध सूचकांक है:
public Integer getArrayElement(final int index) {
if (index < 0 || index >= myArray.length) {
return null; //although I would much prefer an actual exception being thrown when this happens.
}
return myArray[index];
}