কি একটি java.lang.ArrayIndexOutOfBoundsException কারণ এবং আমি এটা কিভাবে প্রতিরোধ করতে পারি?




arrays (16)

ArrayIndexOutOfBoundsException অর্থ কী এবং আমি কীভাবে এটি পরিত্রাণ পেতে পারি?

এখানে একটি কোড নমুনা যা ব্যতিক্রমটিকে ট্রিগার করে:

String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
    System.out.println(name[i]);
}

ArrayIndexOutOfBounds মানে আপনি বরাদ্দ করা হয় না এমন একটি অ্যারের মধ্যে একটি অবস্থান সূচী করার চেষ্টা করছেন।

এক্ষেত্রে:

String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
    System.out.println(name[i]);
}
  • name.length 3 হয় কারণ অ্যারের 3 স্ট্রিং বস্তুর সাথে সংজ্ঞায়িত করা হয়েছে।
  • একটি অ্যারের বিষয়বস্তু অ্যাক্সেস করার সময়, অবস্থান 0 থেকে শুরু হয়। 3 টি আইটেম আছে, এর অর্থ হল [0] = "টম", নাম [1] = "ডিক" এবং নাম [2] = "হ্যারি
  • যখন আপনি লুপ করেন, যেহেতু আমি নাম্বারের চেয়ে কম বা সমান হতে পারি। লম্বা, আপনি নামটি অ্যাক্সেস করার চেষ্টা করছেন [3] যা পাওয়া যায় না।

এই চারপাশে পেতে ...

  • আপনার জন্য লুপ, আপনি আমি <name.length করতে পারেন। এই নামকরণ looping প্রতিরোধ করবে [3] এবং পরিবর্তে নামতে বন্ধ হবে [2]

    for(int i = 0; i<name.length; i++)

  • প্রতিটি লুপ জন্য একটি ব্যবহার করুন

    String[] name = { "tom", "dick", "harry" }; for(String n : name) { System.out.println(n); }

  • তালিকা ব্যবহার করুন। প্রতিটি (গ্রাহক কর্ম) (জাভা 8 প্রয়োজন)

    String[] name = { "tom", "dick", "harry" }; Arrays.asList(name).forEach(System.out::println);

  • অ্যারে স্ট্রীম রূপান্তর করুন - যদি আপনি আপনার অ্যারেতে অতিরিক্ত 'ক্রিয়াকলাপ' সঞ্চালন করতে চান তবে এটি একটি ভাল বিকল্প। ফিল্টার, পাঠকে রূপান্তর, মানচিত্রে রূপান্তর ইত্যাদি (জাভা 8 প্রয়োজন)

    String[] name = { "tom", "dick", "harry" }; --- Arrays.asList(name).stream().forEach(System.out::println); --- Stream.of(name).forEach(System.out::println);


অ্যারে দিয়ে কীভাবে কাজ করা যায় এবং কিভাবে সূচী ব্যতিক্রমগুলির বাইরে এড়াতে হবে তা ব্যাখ্যা করে আমি এখানে সমস্ত উত্তর দেখতে পাচ্ছি। আমি ব্যক্তিগতভাবে সব খরচ অ্যারে এড়াতে। আমি সংগ্রহ ক্লাস ব্যবহার করি, যা সম্পূর্ণরূপে অ্যারে সূচকগুলি মোকাবেলা করার সমস্ত সিলিনেশন এড়ানো হয়। লুপিং সংগ্রহগুলি সমর্থনকারী কোডের সাথে সুন্দরভাবে কাজ করে যা উভয়ই লিখতে, বোঝার এবং বজায় রাখা সহজ।


আপনার কোড অনুযায়ী:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<=name.length; i++) {
  System.out.print(name[i] +'\n');
}

আপনি System.out.print (name.length) চেক করলে;

আপনি পাবেন 3;

মানে আপনার নাম দৈর্ঘ্য 3 হয়

আপনার লুপ 0 থেকে 3 এর মধ্যে চলছে যা "0 থেকে 2" বা "1 থেকে 3" চালানো উচিত।

উত্তর

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<name.length; i++) {
  System.out.print(name[i] +'\n');
}

আপনার কোড ইন আপনি সূচী 0 থেকে উপাদান স্ট্রিং অ্যারের দৈর্ঘ্য অ্যাক্সেস করেছেন। name.length আপনার স্ট্রিং বস্তুর অ্যারের স্ট্রিং বস্তুর সংখ্যা দেয় অর্থাৎ 3, তবে আপনি কেবলমাত্র সূচক 2 name[2] পর্যন্ত অ্যাক্সেস করতে পারেন, কারণ অ্যারেকে 0 থেকে নাম। name.length - 1 -1 তে অ্যাক্সেস করা যেতে পারে যেখানে আপনি পাবেন বস্তুর নাম। name.length সংখ্যা।

এমনকি লুপ ব্যবহার করার সময় আপনি সূচক শূন্য দিয়ে শুরু করেছেন এবং আপনার name.length - 1 অবশ্যই শেষ হবে। name.length - 1 । একটি অ্যারের মধ্যে একটি [n] আপনি একটি [0] ফর্মটি অ্যাক্সেস করতে পারেন [n-1]।

উদাহরণ স্বরূপ:

String[] a={"str1", "str2", str3" ..., "strn"};

for(int i=0;i<a.length()i++)
    System.out.println(a[i]);

আপনার ক্ষেত্রে:

String[] name = {"tom", "dick", "harry"};

for(int i = 0; i<=name.length; i++) {
    System.out.print(name[i] +'\n');
}

আপনার প্রদত্ত অ্যারের জন্য অ্যারের দৈর্ঘ্য 3 (অর্থাৎ নাম। লম্বা = 3)। কিন্তু এটি সূচী 0 থেকে শুরু করে উপাদান সঞ্চয় করে, এটি সর্বোচ্চ সূচক 2 থাকে।

সুতরাং, 'i ** <= name.length' এর পরিবর্তে আপনাকে 'ArrayIndexOutOfBoundsException' এড়াতে ' i <** name.length' লিখতে হবে


আপনি i<=name.length অংশে i<=name.lengthname.length স্ট্রিং name দৈর্ঘ্য ফিরে, যা 3. হয়, তাই আপনি name[3] অ্যাক্সেস করার চেষ্টা করুন name[3] , এটা অবৈধ এবং ব্যতিক্রম ব্যতিক্রম।

সমাধান কোড:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i < name.length; i++) { //use < insteadof <=
  System.out.print(name[i] +'\n');
}

এটা জাভা ভাষা স্পেসিফিকেশন মধ্যে সংজ্ঞায়িত করা হয়:

public final ক্ষেত্র length , যা অ্যারে উপাদান সংখ্যা রয়েছে। length ইতিবাচক বা শূন্য হতে পারে।


আপাতদৃষ্টিতে রহস্যময় ArrayIndexOutOfBoundsExceptions এর জন্য দেখা সবচেয়ে সাধারণ ক্ষেত্রে, অর্থাৎ দৃশ্যত আপনার নিজের অ্যারের হ্যান্ডলিং কোড দ্বারা সৃষ্ট নয়, এটি SimpleDateFormat এর সমতুল্য ব্যবহার। বিশেষভাবে একটি servlet বা নিয়ামক মধ্যে:

public class MyController {
  SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");

  public void handleRequest(ServletRequest req, ServletResponse res) {
    Date date = dateFormat.parse(req.getParameter("date"));
  }
}

যদি দুটি থ্রেড SimplateDateFormat.parse () পদ্ধতি একত্রিত করে তবে আপনি সম্ভবত একটি ArrayIndexOutOfBoundsException দেখতে পাবেন। SimpleDateFormat এর জন্য ক্লাস javadoc এর সিঙ্ক্রোনাইজেশন বিভাগটি লক্ষ্য করুন।

আপনার কোডে এমন কোনও জায়গা নেই যা সরল ডেটফরম্যাটের মতো থ্রেড অনিরাপদ ক্লাস অ্যাক্সেস করছে যা সার্লেট বা নিয়ামক হিসাবে সমান্তরালভাবে থাকে। সম্ভাব্য সন্দেহভাজনদের জন্য আপনার servlets এবং কন্ট্রোলার সব ইনস্ট্যান্স ভেরিয়েবল চেক করুন।


এই ত্রুটি রান লুপ overlimit বার এ ঘটে। চলুন এই মত সহজ উদাহরণ বিবেচনা করা যাক,

class demo{
  public static void main(String a[]){

    int[] numberArray={4,8,2,3,89,5};

    int i;

    for(i=0;i<numberArray.length;i++){
        System.out.print(numberArray[i+1]+"  ");
    }
}

প্রথমে, আমি 'arrayArray' হিসাবে একটি অ্যারে চালু করেছি। তারপরে, কিছু অ্যারের উপাদান লুপ জন্য ব্যবহার করা হয় মুদ্রিত। যখন লুপ 'i' সময় চলমান হয়, তখন (সংখ্যাআ্র্রাই [i + 1] উপাদানটি মুদ্রণ করুন। (যখন আমি মান 1 হয়, সংখ্যাআ্র্রাই [i + 1] উপাদান মুদ্রিত হয়।) অনুমান করুন যে, যখন আমি = (numberArray। দৈর্ঘ্য -2), অ্যারের শেষ উপাদান মুদ্রিত হয় .. যখন 'i' মানটি (numberArray.length-1) যায়, মুদ্রণের জন্য কোনও মান নেই .. সেই বিন্দুতে, 'ArrayIndexOutOfBoundsException' ঘটে। আমি আশা করি আপনি পেতে পারেন ধারণা। আপনি!


একটি অ্যারে প্রতিটি আইটেম একটি উপাদান বলা হয়, এবং প্রতিটি উপাদান তার সাংখ্যিক সূচক দ্বারা অ্যাক্সেস করা হয়। পূর্ববর্তী চিত্রণ হিসাবে দেখানো, সংখ্যা 0 সঙ্গে শুরু হয় । উদাহরণস্বরূপ, 9 তম উপাদান, তাই সূচক 8 এ অ্যাক্সেস করা হবে।

IndexOutOfBoundsException কিছু সাজানোর সূচী (যেমন একটি অ্যারে, একটি স্ট্রিং, বা একটি ভেক্টর) পরিসীমা অতিক্রম করা নির্দেশ করে নিক্ষেপ করা হয়।

কোন অ্যারে এক্স, [0 থেকে (এক্স। লম্বা - 1) থেকে অ্যাক্সেস করা যেতে পারে]


এর মানে হল যে আপনি একটি অ্যারের একটি সূচী অ্যাক্সেস করার চেষ্টা করছেন যা সীমানাগুলির মধ্যে নয় তা বৈধ নয়।

উদাহরণস্বরূপ এটি উপরের আবদ্ধ 4 দিয়ে একটি আদিম পূর্ণসংখ্যা অ্যারে আরম্ভ করবে।

int intArray[] = new int[5];

প্রোগ্রামাররা শূন্য থেকে গণনা। সুতরাং এটি উদাহরণস্বরূপ একটি ArrayIndexOutOfBoundsException নিক্ষেপ করবে উপরের আবদ্ধ 4 এবং 5 নয়।

intArray[5];

যখনই এই ব্যতিক্রমটি আসে তখন ArrayIndexOutOfBoundsException এর অর্থ হল আপনি অ্যারের একটি সূচী ব্যবহার করার চেষ্টা করছেন যা তার সীমার বাইরে রয়েছে অথবা মানুষের শর্তে আপনি আপনার চেয়ে শুরু করার চেয়ে অনুরোধ করছেন।

এটি এড়ানোর জন্য সর্বদা নিশ্চিত হোন যে আপনি এমন কোনও সূচকের অনুরোধ করছেন না যা অ্যারেতে উপস্থিত না হয় যেমন অ্যারের দৈর্ঘ্য 10 হলে আপনার সূচক 0 থেকে 9


সংক্ষিপ্তভাবে লিখতে

শেষ পুনরাবৃত্তি

for (int i = 0; i <= name.length; i++) {

i সমান হবে। name.length যা একটি অবৈধ সূচক, কারণ অ্যারে সূচকগুলি শূন্য-ভিত্তিক।

আপনার কোড পড়া উচিত

for (int i = 0; i < name.length; i++) 
                  ^

ArrayIndexOutOfBoundsException অর্থ হল আপনি অ্যারের একটি সূচী অ্যাক্সেস করার চেষ্টা করছেন যা অ্যারের আবদ্ধ বা অস্তিত্বের বাইরে নেই। অ্যারে সূচী 0 থেকে আরম্ভ এবং দৈর্ঘ্যের শেষে - 1

আপনার ক্ষেত্রে

for(int i = 0; i<=name.length; i++) {
    System.out.print(name[i] +'\n'); // i goes from 0 to length, Not correct
}

ArrayIndexOutOfBoundsException যখন আপনি name.length indexed উপাদানটি অ্যাক্সেস করার চেষ্টা করছেন তখন উপস্থিত হয় না (অ্যারে সূচী দৈর্ঘ্য -1 এ শেষ হয়)। শুধু <= প্রতিস্থাপন <এই সমস্যার সমাধান হবে।

for(int i = 0; i < name.length; i++) {
    System.out.print(name[i] +'\n');  // i goes from 0 to length - 1, Correct
}

ArrayIndexOutOfBoundsException নামটি নিজেই ব্যাখ্যা করে যে যদি আপনি অ্যারের আকারের বাইরে থাকা সূচকের মান অ্যাক্সেস করার চেষ্টা করেন তবে এই ধরণের ব্যতিক্রম ঘটে।

আপনার ক্ষেত্রে, আপনি কেবল লুপের জন্য সমান চিহ্ন সরাতে পারেন।

for(int i = 0; i<name.length; i++)

ভাল বিকল্প একটি অ্যারে পুনরাবৃত্তি করা হয়:

for(String i : name )
      System.out.println(i);

দৈর্ঘ্য n এর যে কোনও অ্যারের জন্য, অ্যারের উপাদানের 0 থেকে n-1 থেকে একটি সূচী থাকবে।

যদি আপনার প্রোগ্রামটি এন-1 এর চেয়ে বেশি অ্যারে সূচী ধারণকারী কোনও উপাদান (বা মেমরি) অ্যাক্সেস করার চেষ্টা করছে, তবে জাভা অ্যারেআইন্ডেক্সঅউটঅফফাউন্ডসঅক্সেস্প

সুতরাং এখানে দুটি সমাধান আমরা একটি প্রোগ্রাম ব্যবহার করতে পারেন

  1. গণনা বজায় রাখা:

    for(int count = 0; count < array.length; count++) {
        System.out.println(array[count]);
    }

    অথবা কিছু অন্যান্য looping বিবৃতি মত

    int count = 0;
    while(count < array.length) {
        System.out.println(array[count]);
        count++;
    }
  2. প্রতিটি লুপের জন্য একটি ভাল উপায় দিয়ে যান, এই পদ্ধতিতে প্রোগ্রামারকে অ্যারের উপাদানগুলির সংখ্যা সম্পর্কে বিরক্ত করার প্রয়োজন নেই।

    for(String str : array) {
        System.out.println(str);
    }

if (index < 0 || index >= array.length) {
    // Don't use this index. This is out of bounds (borders, limits, whatever).
} else {
    // Yes, you can safely use this index. The index is present in the array.
    Object element = array[index];
}

আরো দেখুন:

আপডেট : আপনার কোড স্নিপেট অনুযায়ী,

for (int i = 0; i<=name.length; i++) {

সূচক অ্যারের দৈর্ঘ্য অন্তর্ভুক্ত করা হয়। এই সীমার বাইরে। আপনি <= by < প্রতিস্থাপন করতে হবে।

for (int i = 0; i < name.length; i++) {





indexoutofboundsexception