C# IndexOutOfRangeException – Nedenleri ve Kullanımı

C# IndexOutOfRangeException – Nedenleri ve Kullanımı

13 Ocak 2020 0 Yazar: Mustafa BÜKÜLMEZ
Toplam Görüntülenme : 43
Yaklaşık okuma süresi : 9 DK
C# FormatException - Nedenleri ve Kullanımı
C# ArgumentOutOfRangeException – Nedenleri ve Kullanımı

Merhabalar, C# IndexOutOfRangeException – Nedenleri ve Kullanımı yazım ile Exceptions konulu yazılarıma devam ediyorum. Önceki yazım C# ArgumentOutOfRangeException – Nedenleri ve Kullanımı hakkında idi.  Bu yazımda IndexOutOfRangeException nedenlerini ve nasıl kullanılacağını göreceğiz.

 

C# IndexOutOfRangeException – Nedenleri ve Kullanımı

Devralma :  Object > Exception > SystemException > IndexOutOfRangeException

C# IndexOutOfRangeException – Nedenleri

 

IndexOutOfRangeException, özel durumu bir dizinin yada listenin sınırları dışında kalan bir index’i referans alan işlemlerde çıkar. Örneğin 10 elemenı olan bir dizinin 11. elemanına ulaşmak istediğinizde bu özel durum ortaya çıkar.

Neredeyse tüm IndexOutOfRangeException hataları programcıların hatası olarak çıkar. Burada bir try catch kullanmak yerine hatanın kökünü bulmak en mantıklı yol olacaktır.

Bazı noktalarda For Döngüsü kullanmak başlıca sorun sebebi olabiliyor. Özellikle döngünün kaç kere döneceği konusunda kesin karar veremiyorsanız ForEach Döngüsü imdadınıza yetişecektir.

Aşağıdaki örnekteki kodları çalıştırdığımızda bir IndexOutOfRangeException alırız.

            int[] arr = new int[5];
            arr[0] = 0;
            arr[1] = 1;
            arr[2] = 2;
            arr[3] = 3;
            arr[4] = 4;
            for (int i = 0; i <= arr.Length + 1; i++)
            {
                arr[i] = arr[i] + 1;
            }

Bu kodları aşağıdaki gibi düzenlersek bu hatayı almayız.

     int[] arr = new int[5];
            arr[0] = 0;
            arr[1] = 1;
            arr[2] = 2;
            arr[3] = 3;
            arr[4] = 4;
            for (int i = 0; i < arr.Length + 1; i++)
            {
                arr[i] = arr[i] + 1;
            }

Burada yaptığımız düzeltme ise For satırındaki i<= arr.Length ‘i i< arr.Length olarak düzenledik. Bu hatanın çıkmasının sebebi şudur.

Count, Length terimleri bize eleman sayılarını verir. Bir listedeki eleman sayısı, bir string ifadedeki karakter sayısı vs. ve bu sayılar 1’den başlar.  Ancak index 0 dan başlar.

Yani 10 elemanlı bir bir listenin son elemanın index’i 9’dur.Yukarıdaki örnekte Length kullandık. Bir Array List’in lenght’i köşeli parantez içerisinde verdiğimiz sayıdır. Bu örnek için bu sayı 5’tir. Bu arrayList 5 eleman alabilir. 5. elemanın index’i 4 olacaktır.

İlgili İçerik  C# Form AcceptButton CancelButton

For döngüsünü Lenght ile yapıp eşitlik durumuna da bak dediğimizde sayı 5’e çıkacağından, ArrayList’in 5. index’ine bakmaya çalışacak. Ancak 5 elemenlı bu dizide son eleman 4. İndexte yer alıyor. Bu yüzden ArrayList’in sınırları dışına çıkmış oluyoruz.

 

            int[] arr1 = new int[5];
            arr1[0] = 1;
            arr1[1] = 2;
            arr1[2] = 3;
            arr1[3] = 4;
            arr1[4] = 5;
            int ii = arr1[5];

Bu kodlara bakarsak daha rahat anlayacaksınız. 5 eleman tutabilecek bir ArrayList tanımladık. Bu ArrayList’e 5 tane de eleman yükledik.  Köşeli parantezler içinde yer alan rakamlar index numarasıdır. Eşittirin sağındaki sayılar ise ArrayList’in elemanlarıdır.

Son satırda biz bu ArrayList içinde, index numarası 5 olan sayıyı almak istedik. ArrayList, 5. index’e sahip olmadığından dolayı hata alıyoruz.

C# IndexOutOfRangeException – Kullanımı

Microsoft’un sitesinde kullanımı hakkında bir örnek bulamadım. Bu sebeple ArgumentOutOfRangeException dersimdeki örneği kullanacağım.  İlk örnekte bir misafirin yaşı 21 ‘den küçük ise hata çıkarmasını istemiştik. Bu örneğimizde de yaş 50’den büyükse hata vermesini isteyeceğiz. Öne Misafir class’ının son halini veriyorum.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace mustafabukulmez_com_dersler._000_Classlar
{
    class Misafirler
    {
        private string FirstName;
        private string LastName;
        private int Age;

        public Misafirler(string fName, string lName, int age)
        {
            FirstName = fName;
            LastName = lName;
            if (age > 50)
                throw new IndexOutOfRangeException("Yaş;" + Environment.NewLine + "Değer: " + age + Environment.NewLine + "Tüm misafirler 50 yaşında ya da daha küçük olmalıdır.");
            if (age < 21)
                throw new ArgumentOutOfRangeException("Yaş;" + Environment.NewLine + "Değer: " + age, "Tüm misafirler 21 yaşında ya da daha büyük olmalıdır.");
            else
                Age = age;
        }

        public string MisafirBilgi()
        {
            string gInfo = FirstName + " " + LastName + ", " + Age.ToString();
            return (gInfo);
        }
    }
}

Gördüğünüz gibi yaş 21’den küçük ise ArgumentOutOfRangeException, 50 ‘den büyük ise IndexOutOfRangeException hatasını vermesini istedik.

NOT: Burada bu hataları başlatırken her birinin başlatıcıları (metodları) farklı parametreler alıyorlar. Bir standardı yok gibi görünüyor.

        private void btn_IndexOutOfRangeException_Click(object sender, EventArgs e)
        {

            try
            {
                _000_Classlar.Misafirler misafir1 = new _000_Classlar.Misafirler("Mustafa", "Bükülmez", 57);
                MessageBox.Show(misafir1.MisafirBilgi());
            }
            catch (IndexOutOfRangeException ex)
            {
                txt_cikti.Text += ex.GetType().Name + ":" + ex.Message;
            }
        }

Kullanımı da yukarıda gördüğünüz gibi oluyor.

İlgili İçerik  C# FormatException - Nedenleri ve Kullanımı

Sanırım diğer Exception konularını da bu class üzerinden yapacağım. 🙂

Daha fazla bilgiye Microsoft.Docs sitesinden ulaşabilirsiniz.


C# IndexOutOfRangeException – Nedenleri ve Kullanımı dersimiz de bu kadardı arkadaşlar.

Tüm Exceptions derslerime bağlantıdan ulaşabilirsiniz.

C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.

Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz… Bu dersim Github projemde yerini almıştır. Tüm Exception adı altında eklediğim dersleri Github projeme ekleyeceğim.

Sağlıcakla ve takipte kalın. 😉

C# FormatException - Nedenleri ve Kullanımı
C# ArgumentOutOfRangeException – Nedenleri ve Kullanımı