একটি ইনডেক্সআউটআফরেঞ্জএক্সসেপশন / আর্গুমেন্টআউটঅফরাঞ্জএক্সসেপশন কী এবং আমি কীভাবে এটি ঠিক করব?


191

আমার কিছু কোড রয়েছে এবং এটি কার্যকর হলে এটি একটি ছুড়ে ফেলে IndexOutOfRangeExceptionবলে,

সূচক অ্যারের সীমার বাইরে ছিল।

এর অর্থ কী, এবং আমি এটি সম্পর্কে কী করতে পারি?

ব্যবহৃত ক্লাসগুলির উপর নির্ভর করে এটিও হতে পারে ArgumentOutOfRangeException

'সিস্টেম.আরগমেন্টআউটআফরেঞ্জইসেপশন' টাইপের ব্যতিক্রমটি mscorlib.dll এ এসেছিল তবে ব্যবহারকারীর কোডে এটি পরিচালিত হয়নি অতিরিক্ত তথ্য: সূচক সীমার বাইরে ছিল। সংগ্রহের আকারের তুলনায় অ-নেতিবাচক এবং কম হতে হবে।


আপনার সংগ্রহে যদি আপনার কাছে কেবল 4 টি আইটেম থাকে তবে কোডটি সূচী 5 এ একটি আইটেম পাওয়ার চেষ্টা করেছিল This এটি সূচকটি ছাড়বে R সূচি পরীক্ষা করুন = 5; if (items.Length> = index) কনসোল.উরাইটলাইন (ইন্টেমেজ [সূচক]);
বাবু কুমারসামি

উত্তর:


232

এটা কি?

এই ব্যতিক্রমটির অর্থ হ'ল আপনি একটি অবৈধ সূচক ব্যবহার করে সূচী দ্বারা কোনও সংগ্রহ আইটেম অ্যাক্সেস করার চেষ্টা করছেন। যখন সূচকটি সংগ্রহের নিম্ন বাউন্ডের চেয়ে কম থাকে বা এতে থাকা উপাদানগুলির সংখ্যার চেয়ে বড় বা সমান হয় invalid

যখন এটি নিক্ষেপ করা হয়

প্রদত্ত একটি অ্যারে হিসাবে দেওয়া হয়েছে:

byte[] array = new byte[4];

আপনি 0 থেকে 3 পর্যন্ত এই অ্যারে অ্যাক্সেস করতে পারেন, এই ব্যাপ্তির বাইরের মানগুলি IndexOutOfRangeExceptionনিক্ষেপ করার কারণ হবে । আপনি যখন কোনও অ্যারে তৈরি এবং অ্যাক্সেস করবেন তখন এটি মনে রাখবেন।


সি # তে অ্যারের দৈর্ঘ্য , সাধারণত, অ্যারে 0-ভিত্তিক হয়। এর অর্থ হ'ল প্রথম উপাদানটির সূচক 0 এবং সর্বশেষ উপাদানটির সূচক থাকে Length - 1(যেখানে whereLength অ্যারেতে আইটেমের মোট সংখ্যা রয়েছে) তাই এই কোডটি কাজ করে না:

array[array.Length] = 0;

তদুপরি দয়া করে নোট করুন যে আপনার যদি একটি বহুমাত্রিক অ্যারে থাকে তবে আপনি Array.Lengthউভয় মাত্রার জন্য ব্যবহার করতে পারবেন না , আপনাকে ব্যবহার করতে হবেArray.GetLength() :

int[,] data = new int[10, 5];
for (int i=0; i < data.GetLength(0); ++i) {
    for (int j=0; j < data.GetLength(1); ++j) {
        data[i, j] = 1;
    }
}

উপরের
সীমাটি অন্তর্ভুক্ত নয় নিম্নলিখিত উদাহরণে আমরা একটি কাঁচা দ্বি-মাত্রিক অ্যারে তৈরি করি Color। প্রতিটি আইটেম একটি পিক্সেল প্রতিনিধিত্ব করে, সূচকগুলি থেকে শুরু (0, 0)করে(imageWidth - 1, imageHeight - 1)

Color[,] pixels = new Color[imageWidth, imageHeight];
for (int x = 0; x <= imageWidth; ++x) {
    for (int y = 0; y <= imageHeight; ++y) {
        pixels[x, y] = backgroundColor;
    }
}

এই কোডটি তখন ব্যর্থ হবে কারণ অ্যারেটি 0-ভিত্তিক এবং চিত্রের সর্বশেষ (নীচে-ডান) পিক্সেল pixels[imageWidth - 1, imageHeight - 1] :

pixels[imageWidth, imageHeight] = Color.Black;

অন্য পরিস্থিতিতে আপনি ArgumentOutOfRangeExceptionএই কোডটি পেতে পারেন (উদাহরণস্বরূপ আপনি যদি ব্যবহার করছেন)GetPixel কোনও Bitmapক্লাসে পদ্ধতি )।

অ্যারেগুলি বাড়বে না
একটি অ্যারে দ্রুত। প্রতিটি অন্যান্য সংগ্রহের তুলনায় রৈখিক অনুসন্ধানে খুব দ্রুত। আইটেমগুলি মেমোরিতে সামঞ্জস্যপূর্ণ তাই মেমরির ঠিকানা গণনা করা যায় (এবং বৃদ্ধি কেবল একটি সংযোজন)। কোনও নোড তালিকা অনুসরণ করার দরকার নেই, সাধারণ গণিত! আপনি এটি একটি সীমাবদ্ধতার সাথে প্রদান করুন: এগুলি বাড়তে পারে না, যদি আপনার আরও উপাদানগুলির প্রয়োজন হয় তবে আপনাকে সেই অ্যারেটি পুনর্বিবেচনার প্রয়োজন (পুরানো আইটেমগুলি একটি নতুন ব্লকে অনুলিপি করতে হবে যদি এটি তুলনামূলকভাবে দীর্ঘ সময় নিতে পারে)। আপনি তাদের দিয়ে আকার পরিবর্তন করুনArray.Resize<T>() , এই উদাহরণটি বিদ্যমান অ্যারেটিতে একটি নতুন এন্ট্রি যুক্ত করে:

Array.Resize(ref array, array.Length + 1);

ভুলে যাবেন না যে বৈধ সূচকগুলি থেকে শুরু 0করে Length - 1। আপনি যদি কেবল কোনও আইটেম অর্পণ করার চেষ্টা করেন তবে Lengthআপনি পাবেনIndexOutOfRangeException (যদি আপনি মনে করি তারা অনুরূপ একটি বাক্য গঠন সঙ্গে বৃদ্ধি হতে পারে এই আচরণ আপনি গুলান পারে Insertঅন্যান্য সংগ্রহের পদ্ধতি)।

কাস্টম লোয়ার বাউন্ডের সাথে বিশেষ অ্যারে
অ্যারেতে প্রথম আইটেমটিতে সর্বদা 0 সূচক থাকে । এটি সর্বদা সত্য নয় কারণ আপনি কাস্টম নিম্ন সীমাবদ্ধ করে একটি অ্যারে তৈরি করতে পারেন:

var array = Array.CreateInstance(typeof(byte), new int[] { 4 }, new int[] { 1 });

উদাহরণস্বরূপ, অ্যারে সূচকগুলি 1 থেকে 4 অবধি বৈধ, অবশ্যই, উপরের সীমাটি পরিবর্তন করা যায় না।

ভুল যুক্তি
যদি আপনি অবৈধ আর্গুমেন্ট (ব্যবহারকারী ইনপুট বা ফাংশন ব্যবহারকারীর মাধ্যমে) ব্যবহার করে কোনও অ্যারে অ্যাক্সেস করেন তবে আপনি এই ত্রুটিটি পেতে পারেন:

private static string[] RomanNumbers =
    new string[] { "I", "II", "III", "IV", "V" };

public static string Romanize(int number)
{
    return RomanNumbers[number];
}

অপ্রত্যাশিত ফলাফল
এই ব্যতিক্রমটি অন্য কারণেও ছুঁড়ে দেওয়া যেতে পারে: কনভেনশন অনুসারে, অনেক অনুসন্ধান ফাংশন ফিরে আসবে -1 (নোটগুলি .NET 2.0 এর সাথে প্রবর্তিত হয়েছে এবং যাইহোক এটি বহু বছর থেকে ব্যবহৃত একটি পরিচিত কনভেনশনও রয়েছে) যদি তারা না করে ' কিছু খুঁজে না। আসুন কল্পনা করুন যে আপনার কাছে স্ট্রিংয়ের সাথে তুলনা করার মতো অবজেক্টের অ্যারে রয়েছে। আপনি এই কোডটি লিখতে ভাবতে পারেন:

// Items comparable with a string
Console.WriteLine("First item equals to 'Debug' is '{0}'.",
    myArray[Array.IndexOf(myArray, "Debug")]);

// Arbitrary objects
Console.WriteLine("First item equals to 'Debug' is '{0}'.",
    myArray[Array.FindIndex(myArray, x => x.Type == "Debug")]);

এতে কোনও আইটেম myArrayঅনুসন্ধান শর্ত পূরণ না করলে এটি ব্যর্থ হবে কারণ Array.IndexOf()-1 ফিরে আসবে এবং তারপরে অ্যারে অ্যাক্সেস নিক্ষেপ করবে।

পরবর্তী উদাহরণটি প্রদত্ত সংখ্যার সংখ্যার উপস্থিতি গণনা করার জন্য একটি নিষ্পাপ উদাহরণ (সর্বাধিক সংখ্যা জানার এবং একটি অ্যারে ফিরিয়ে দেওয়া যেখানে সূচীতে 0 আইটেমটি 0 টি প্রতিনিধিত্ব করে, সূচী 1 এ থাকা আইটেমগুলি 1 নম্বর উপস্থাপন করে):

static int[] CountOccurences(int maximum, IEnumerable<int> numbers) {
    int[] result = new int[maximum + 1]; // Includes 0

    foreach (int number in numbers)
        ++result[number];

    return result;
}

অবশ্যই, এটি একটি দুর্দান্ত ভয়ঙ্কর বাস্তবায়ন তবে আমি যেটি দেখাতে চাই তা হ'ল এটি উপরের নেতিবাচক সংখ্যা এবং সংখ্যার জন্য ব্যর্থ হবে maximum

এটি কীভাবে প্রযোজ্য List<T> ?

অ্যারে হিসাবে একই ক্ষেত্রে - বৈধ সূচকগুলির পরিসীমা - 0 ( Listএর সূচকগুলি সর্বদা 0 দিয়ে শুরু হয়) থেকে শুরু হয়list.Count - এই ব্যাপ্তির বাইরের উপাদানগুলিতে অ্যাক্সেস ব্যতিক্রম ঘটায়।

লক্ষ্য করুন List<T>ছোঁড়ার ArgumentOutOfRangeExceptionএকই ক্ষেত্রে যেখানে অ্যারে ব্যবহারIndexOutOfRangeException

অ্যারেগুলির বিপরীতে, List<T>খালি শুরু হয় - সুতরাং স্রেফ তৈরি তালিকার আইটেমগুলিতে অ্যাক্সেস করার চেষ্টা করা এই ব্যতিক্রমের দিকে নিয়ে যায়।

var list = new List<int>();

সাধারণ ক্ষেত্রে তালিকার সাথে তালিকা তৈরি করা (এর অনুরূপ Dictionary<int, T>) ব্যতিক্রম ঘটায়:

list[0] = 42; // exception
list.Add(42); // correct

IDataReader এবং কলামগুলি
কল্পনা করুন আপনি এই কোড সহ একটি ডাটাবেস থেকে ডেটা পড়ার চেষ্টা করছেন:

using (var connection = CreateConnection()) {
    using (var command = connection.CreateCommand()) {
        command.CommandText = "SELECT MyColumn1, MyColumn2 FROM MyTable";

        using (var reader = command.ExecuteReader()) {
            while (reader.Read()) {
                ProcessData(reader.GetString(2)); // Throws!
            }
        }
    }
}

GetString()নিক্ষেপ করবে IndexOutOfRangeExceptionকারণ আপনার ডেটাসেটের কেবল দুটি কলাম রয়েছে তবে আপনি তৃতীয়টি থেকে মান পেতে চেষ্টা করছেন (সূচকগুলি হ'ল) সর্বদা 0-ভিত্তিক থাকে)।

দয়া করে মনে রাখবেন যে এই আচরণটি বেশিরভাগ IDataReaderবাস্তবায়নের সাথে ভাগ করা হয় ( SqlDataReader,OleDbDataReader ইত্যাদি)।

আপনি যদি একই সূচক অপারেটরের IDataReader ওভারলোড ব্যবহার করেন যা কোনও কলামের নাম নেয় এবং একটি অবৈধ কলামের নাম পাস করেও আপনি একই ব্যতিক্রমটি পেতে পারেন।
ধরুন উদাহরণস্বরূপ যে আপনি কলাম 1 নামে একটি কলাম পুনরুদ্ধার করেছেন তবে তারপরে আপনি সেই ক্ষেত্রটির মান পুনরুদ্ধার করার চেষ্টা করছেন

 var data = dr["Colum1"];  // Missing the n in Column1.

এটি ঘটে কারণ সূচক অপারেটর কলম 1 ক্ষেত্রের সূচিটি পুনরুদ্ধার করার চেষ্টা করে প্রয়োগ করা হয় যা বিদ্যমান নেই। যখন এর অভ্যন্তরীণ সহায়ক কোডটি "কলাম 1" এর সূচি হিসাবে একটি -1 প্রদান করবে তখন getOrdinal পদ্ধতিটি এই ব্যতিক্রমটিকে ছুঁড়ে দেবে।

অন্যরা
এই ব্যতিক্রম নিক্ষেপ করার সময় আরও একটি (নথিভুক্ত) কেস রয়েছে: যদি, সম্পত্তিটিতে DataViewসরবরাহ করা ডেটা কলামের নামটি DataViewSortবৈধ নয়।

কিভাবে এড়াতে

এই উদাহরণে, আমি ধরে নিতে পারি, সরলতার জন্য, অ্যারেগুলি সর্বদা একক মাত্রা এবং 0-ভিত্তিক থাকে। আপনি যদি কঠোর হতে চান (বা আপনি একটি লাইব্রেরি বিকাশ করছেন), আপনার 0সাথে GetLowerBound(0)এবং এর .Lengthসাথে প্রতিস্থাপনের প্রয়োজন হতে পারে GetUpperBound(0)(অবশ্যই আপনার যদি System.Array টাইপের পরামিতি থাকে তবে এটি প্রয়োগ হয় না T[])। দয়া করে নোট করুন যে এই ক্ষেত্রে, উপরের সীমাটি এই কোডটি সমেত অন্তর্ভুক্ত:

for (int i=0; i < array.Length; ++i) { }

এটি আবার লিখতে হবে:

for (int i=array.GetLowerBound(0); i <= array.GetUpperBound(0); ++i) { }

দয়া করে নোট করুন যে এটি অনুমোদিত নয় (এটি নিক্ষেপ করবে InvalidCastException), এ কারণেই যদি আপনার পরামিতিগুলি T[]আপনি কাস্টম নিম্ন সীমাবদ্ধ অ্যারেগুলি সম্পর্কে সুরক্ষিত থাকেন:

void foo<T>(T[] array) { }

void test() {
    // This will throw InvalidCastException, cannot convert Int32[] to Int32[*]
    foo((int)Array.CreateInstance(typeof(int), new int[] { 1 }, new int[] { 1 }));
}

বৈধ প্যারামিটারগুলি
যদি সূচকটি কোনও প্যারামিটার থেকে আসে তবে আপনার সর্বদা সেগুলি বৈধ করা উচিত (উপযুক্ত নিক্ষেপ করা ArgumentExceptionবা ArgumentOutOfRangeException)। পরবর্তী উদাহরণে, ভুল প্যারামিটারগুলির কারণ হতে পারে IndexOutOfRangeException, এই ফাংশনের ব্যবহারকারীরা এটি আশা করতে পারে কারণ তারা অ্যারে পাস করছে তবে এটি সর্বদা এতটা স্পষ্ট নয়। আমি সর্বদা সর্বজনীন কার্যাবলীর জন্য পরামিতিগুলির বৈধতা দেওয়ার পরামর্শ দিই:

static void SetRange<T>(T[] array, int from, int length, Func<i, T> function)
{
    if (from < 0 || from>= array.Length)
        throw new ArgumentOutOfRangeException("from");

    if (length < 0)
        throw new ArgumentOutOfRangeException("length");

    if (from + length > array.Length)
        throw new ArgumentException("...");

    for (int i=from; i < from + length; ++i)
        array[i] = function(i);
}

যদি ফাংশনটি ব্যক্তিগত হয় তবে আপনি কেবল ifযুক্তিগুলি এর সাথে প্রতিস্থাপন করতে পারেন Debug.Assert():

Debug.Assert(from >= 0 && from < array.Length);

চেক অবজেক্টের স্টেট
অ্যারে সূচি প্যারামিটার থেকে সরাসরি আসতে পারে না। এটি অবজেক্ট স্টেটের অংশ হতে পারে। সাধারণভাবে সর্বদা অবজেক্টের অবস্থা যাচাই করার জন্য একটি ভাল অনুশীলন (নিজে থেকে এবং ফাংশন পরামিতি সহ, যদি প্রয়োজন হয়)। আপনি ব্যবহার করতে পারেন Debug.Assert(), একটি সঠিক ব্যতিক্রম ছোঁড়া (সমস্যাটি সম্পর্কে আরও বর্ণনামূলক) বা হ্যান্ডেল করতে পারেন যা এই উদাহরণে:

class Table {
    public int SelectedIndex { get; set; }
    public Row[] Rows { get; set; }

    public Row SelectedRow {
        get {
            if (Rows == null)
                throw new InvalidOperationException("...");

            // No or wrong selection, here we just return null for
            // this case (it may be the reason we use this property
            // instead of direct access)
            if (SelectedIndex < 0 || SelectedIndex >= Rows.Length)
                return null;

            return Rows[SelectedIndex];
        }
}

বৈধ করুন ফেরতের মানগুলি
পূর্ববর্তী উদাহরণগুলির মধ্যে একটিতে আমরা প্রত্যক্ষ Array.IndexOf()মানের ব্যবহার করেছি । আমরা যদি জানি যে এটি ব্যর্থ হতে পারে তবে সেই মামলাটি পরিচালনা করা ভাল:

int index = myArray[Array.IndexOf(myArray, "Debug");
if (index != -1) { } else { }

কীভাবে ডিবাগ করবেন

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

আপনার সোর্স কোড রয়েছে, আপনার স্ট্যাক ট্রেস সহ ব্যতিক্রম বার্তা রয়েছে। সেখানে যান, ডান লাইন নম্বরটি চয়ন করুন এবং আপনি দেখতে পাবেন:

array[index] = newValue;

আপনি আপনার ত্রুটিটি পেয়েছেন, পরীক্ষা করে দেখুন কীভাবে indexবৃদ্ধি পায়। এটা কি ঠিক? অ্যারে কীভাবে বরাদ্দ করা হয় তা পরীক্ষা করে দেখুন কীভাবে indexবৃদ্ধি হয়? আপনার স্পেসিফিকেশন অনুযায়ী সঠিক? উত্তর দিলে হ্যাঁ এই সমস্ত , তবে আপনি স্ট্যাকওভারফ্লোতে এখানে ভাল সহায়তা পাবেন তবে দয়া করে প্রথমে নিজের জন্য এটি পরীক্ষা করে দেখুন। আপনি আপনার নিজের সময় বাঁচাতে হবে!

একটি ভাল সূচনা পয়েন্ট হ'ল সর্বদা দৃ .়তা ব্যবহার করা এবং ইনপুটগুলি বৈধ করা। আপনি এমনকি কোড চুক্তি ব্যবহার করতে চাইতে পারেন। যখন কোনও কিছু ভুল হয়ে গেছে এবং আপনার কোডটি তাত্ক্ষণিকভাবে কী ঘটেছিল তা আপনি বুঝতে পারবেন না তখন আপনাকে কোনও পুরানো বন্ধুর অবলম্বন করতে হবে: ডিবাগার । ভিজ্যুয়াল স্টুডিওতে (বা আপনার পছন্দের আইডিই) ভিতরে ডিবাগ করে কেবল আপনার অ্যাপ্লিকেশনটি চালান, আপনি ঠিক দেখতে পাবেন কোন রেখাটি এই ব্যতিক্রমটিকে ছুঁড়ে ফেলেছে, কোন অ্যারে জড়িত এবং আপনি কোন সূচকটি ব্যবহার করার চেষ্টা করছেন। সত্যিই, 99% বার আপনি কয়েক মিনিটের মধ্যে এটি নিজের দ্বারা সমাধান করবেন।

যদি উত্পাদনের ক্ষেত্রে এটি ঘটে থাকে তবে আপনি ইনক্রিমিন্টেড কোডে দৃ add়তা যুক্ত করা ভাল, সম্ভবত আমরা আপনার কোডটিতে এটি দেখতে পাব না যা আপনি নিজের দ্বারা দেখতে পাচ্ছেন না (তবে আপনি সর্বদা বাজি রাখতে পারেন)।

গল্পটির ভিবি.এনইটি পাশ

আমরা সি # উত্তরটিতে যা কিছু বলেছি তা সুস্পষ্ট বাক্য গঠনগুলির সাথে VB.NET এর জন্য বৈধ তবে আপনি ভিবি.এনইট অ্যারেগুলি কখন মোকাবেলা করবেন তা বিবেচনার জন্য একটি গুরুত্বপূর্ণ বিষয় রয়েছে।

ভিবি.এনইটি-তে, অ্যারেগুলি অ্যারের জন্য সর্বাধিক বৈধ সূচক মান নির্ধারণ করে বলে ঘোষণা করা হয়। অ্যারের মধ্যে আমরা যে উপাদানগুলি সংরক্ষণ করতে চাই তা এটি গণনা নয়।

' declares an array with space for 5 integer 
' 4 is the maximum valid index starting from 0 to 4
Dim myArray(4) as Integer

সুতরাং এই লুপটি কোনও ইনডেক্সআউটআফরেঞ্জইসেপশন না ঘটিয়ে 5 টি পূর্ণসংখ্যার সাথে অ্যারে পূরণ করবে

For i As Integer = 0 To 4
    myArray(i) = i
Next

VB.NET নিয়ম

এই ব্যতিক্রমটির অর্থ হ'ল আপনি একটি অবৈধ সূচক ব্যবহার করে সূচী দ্বারা কোনও সংগ্রহ আইটেম অ্যাক্সেস করার চেষ্টা করছেন। কোনও সূচকটি যখন সংগ্রহের নিম্নের বাউন্ডের চেয়ে কম বা তার চেয়ে বেশি হয় তখন অবৈধএটিতে থাকা উপাদানের সংখ্যার সমান। অ্যারে ঘোষণায় সংজ্ঞায়িত সর্বাধিক অনুমোদিত সূচক


19

সীমাবদ্ধ ব্যতিক্রমের বাইরে কোনও সূচক কী সম্পর্কে সহজ ব্যাখ্যা:

একবার ভাবেন যে একটি ট্রেন রয়েছে তার ডিপার্টমেন্টগুলি ডি 1, ডি 2, ডি 3 রয়েছে। একজন যাত্রী ট্রেনে প্রবেশ করতে এসেছিলেন এবং তাঁর কাছে ডি 4 এর টিকিট রয়েছে। এখন কি হবে। যাত্রী এমন একটি বগিতে প্রবেশ করতে চান যা বিদ্যমান নেই তাই স্পষ্টতই সমস্যা দেখা দেবে।

একই পরিস্থিতি: যখনই আমরা কোনও অ্যারে তালিকা ইত্যাদি অ্যাক্সেস করার চেষ্টা করি আমরা কেবল অ্যারেতে বিদ্যমান সূচিগুলি অ্যাক্সেস করতে পারি। array[0]এবং array[1]বিদ্যমান। আমরা যদি অ্যাক্সেস করার চেষ্টা করি তবে array[3]এটি আসলে নেই, সুতরাং সীমাবদ্ধ ব্যতিক্রমের বাইরে একটি সূচি উত্থাপিত হবে।


10

সহজেই সমস্যাটি বুঝতে, কল্পনা করুন আমরা এই কোডটি লিখেছি:

static void Main(string[] args)
{
    string[] test = new string[3];
    test[0]= "hello1";
    test[1]= "hello2";
    test[2]= "hello3";

    for (int i = 0; i <= 3; i++)
    {
        Console.WriteLine(test[i].ToString());
    }
}

ফলাফলগুলি হ'ল:

hello1
hello2
hello3

Unhandled Exception: System.IndexOutOfRangeException: Index was outside the bounds of the array.

অ্যারের আকার 3 (সূচক 0, 1 এবং 2), তবে লুপটির জন্য 4 বার লুপ (0, 1, 2 এবং 3)।
সুতরাং যখন এটি (3) দিয়ে সীমার বাইরে অ্যাক্সেস করার চেষ্টা করে তখন এটি ব্যতিক্রম ছুঁড়ে দেয়।


1

খুব দীর্ঘ সম্পূর্ণ গ্রহণযোগ্য উত্তরের একটি দিক IndexOutOfRangeExceptionঅন্যান্য অনেক ব্যতিক্রম ধরণের সাথে তুলনা করার জন্য একটি গুরুত্বপূর্ণ বিষয় রয়েছে এবং তা হ'ল:

প্রায়শই জটিল প্রোগ্রামের স্টেট থাকে যে কোডের কোনও নির্দিষ্ট পয়েন্টে নিয়ন্ত্রণ রাখা সম্ভবত কঠিন যেমন একটি ডিবি সংযোগ নিচে চলে যায় তাই কোনও ইনপুটটির ডেটা পুনরুদ্ধার করা যায় না ... এই জাতীয় সমস্যাটি প্রায়শই কোনওরকম ব্যতিক্রম ব্যতীত ফলাফল হয় যে একটি উচ্চ স্তরে বুদবুদ করতে হবে কারণ যেখানে এটি ঘটে সেই মুহুর্তে এটির সাথে ডিল করার কোনও উপায় নেই।

IndexOutOfRangeExceptionসাধারণত এটি ভিন্ন যে এটি বেশিরভাগ ক্ষেত্রে ব্যতিক্রমটি উত্থাপিত হচ্ছে এমন পর্যায়ে যাচাই করা বেশ নগণ্য। সাধারণত অ্যারেটির প্রকৃত দৈর্ঘ্য পরীক্ষা করে এই কোডটি এমন কোনও কোড দ্বারা ছুঁড়ে ফেলা হয় যা এটি ঘটছে এমন জায়গায় খুব সহজেই সমস্যাটি মোকাবেলা করতে পারে। আপনি এই ব্যতিক্রমটিকে উচ্চতরভাবে পরিচালনা করে এটি 'ফিক্স' করতে চান না - পরিবর্তে এটি প্রথম নজরে নিক্ষেপ না করে তা নিশ্চিত করে - যা বেশিরভাগ ক্ষেত্রে অ্যারের দৈর্ঘ্য পরীক্ষা করে খুব সহজে করা সম্ভব।

এটি রাখার আরেকটি উপায় হ'ল অন্যান্য ব্যতিক্রমগুলি ইনপুট বা প্রোগ্রামের স্টেটের উপর সত্যিকারের নিয়ন্ত্রণের অভাবের কারণে উত্থিত হতে পারে IndexOutOfRangeExceptionতবে প্রায়শই না কেবল কেবল পাইলট (প্রোগ্রামার) ত্রুটি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.