Шаг 230.
Язык программирования C#. Начала.
Обработка исключений. Использование исключений. Пример 3

    На этом шаге мы рассмотрим еще один пример использования исключений.

    В следующем примере обработка исключений используется для прекращения работы циклической конструкции. Рассмотрим следующую программу:

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

namespace pr230_1
{
    // Класс с индексатором: 
    class MyClass {
        // Закрытое поле - ссылка на массив: 
        private int[] nums;
        // Конструктор: 
        public MyClass(int size) { 
            nums = new int[size];
        }
        // Индексатор: 
        public int this [int k] {
            // Аксессор для считывания значения: 
            get {
                return nums[k];
            }
            // Аксессор для присваивания значения: 
            set {
                nums[k] = value;
            }
        }
    }

    // Главный класс:
    class Program
    {
        // Метод для отображения значений элементов 
        // массива из объекта: 
        static void show(MyClass obj) {
            // Целочисленная переменная: 
            int k = 0;
            // Контролируемый блок: 
            try {
                // Конструкция цикла: 
                while(true) {
                    // Отображение значения элемента массива: 
                    Console.Write("|" + obj[k]);
                    // Увеличение значения индексной переменной: 
                    k++;
                }
            }
            // Обработка исключений: 
            catch(IndexOutOfRangeException) { 
                Console.WriteLine("|");
            }
        }

        // Главный метод:
        static void Main()
        {
            // Создание объекта класса:
            MyClass obj = new MyClass(10);
            // Целочисленная переменная: 
            int k = 0;
            // Контролируемый код: 
            try {
                // Циклическая конструкция: 
                do {
                    // Присваивание значения элементу массива
                    // в объекте:
                    obj[k] = 2 * k + 1;
                    // Увеличение значения индексной переменной: 
                    k++;
                } while(true);
            }
            // Обработка исключений: 
            catch(IndexOutOfRangeException) {
                // Отображение содержимого массива из объекта: 
                show(obj);
            }
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы такой:


Рис.1. Результат выполнения программы

    В этом примере мы описали класс MyClass, в котором есть закрытое поле nums, являющееся ссылкой на целочисленный массив. Массив создается при вызове конструктора. Аргументом конструктору передается число, определяющее размер массива. Для доступа к элементам массива используется индексатор. Проблема в том, что массив закрытый, но в классе не определены свойство или метод, которые позволили бы узнать размер массива.

    В главном классе описан статический метод show(), который не возвращает результат. Аргументом методу передается объект класса MyClass. Метод предназначен для отображения содержимого массива из объекта, переданного методу в качестве аргумента. Для этого в try-блоке запускается формально бесконечный цикл while. За каждую итерацию цикла отображается значение проиндексированного объекта (значение элемента массива из объекта), и индекс увеличивается на единицу. Как только будет предпринята попытка считать значение несуществующего элемента, будет сгенерировано исключение класса IndexOutOfRangeException. Как следствие, выполнение конструкции цикла прекращается, а исключение обрабатывается в catch-блоке.

    В главном методе командой

  MyClass obj = new MyClass(10);
создается объект obj класса MyClass, в котором "спрятан" массив из 10 элементов. Для заполнения массива в try-блоке запускается бесконечный цикл do-while. Командой
  obj[k] = 2 * k + 1;
очередному элементу массива присваивается значение (нечетное число), а затем командой
  k++;
увеличивается значение индекса. Цикл завершает выполнение при возникновении исключения класса IndexOutOfRangeException (попытка присвоить значение несуществующему элементу). При обработке этого исключения в catch-блоке с помощью команды
  show(obj);
отображается содержимое массива из объекта obj (последовательность из 10 нечетных чисел).

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание