কি কারণে 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
, এখানে কয়েকটি মূল বিষয় বিবেচনা করতে হবে:
looping
অ্যারের মাধ্যমে লুপিংয়ের সময় সর্বদা নিশ্চিত হয়ে নিন যে আপনি যে সূচকটি পুনরুদ্ধার করছেন সেটি অ্যারের দৈর্ঘ্যের (বাক্সের সংখ্যা) এর চেয়ে কঠোরভাবে ছোট। এই ক্ষেত্রে:
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];
}