Опубликован: 18.09.2006 | Уровень: специалист | Доступ: свободно | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 10:

Основные конструкции языков Java и C#

  • Блок обработки исключительных ситуаций выглядит так:
    try                  {  statements  } Ag
    catch ( type_1 e_1 ) { statements_1 } Ag
    … Ag
    catch ( type_n e_n ) { statements_n } Ag
    finally              { statements_f } Ag

    Если во время выполнения одной из инструкций в блоке, следующем за try, возникает исключение, управление передается на первый блок catch, обрабатывающий исключения такого же или более широкого типа. Если подходящих блоков catch нет, выполняется блок finally и исключение выбрасывается дальше.

    Блок finally выполняется всегда — сразу после блока try, если исключения не возникло, или сразу после обрабатывавшего исключение блока catch, даже если он выбросил новое исключение.

    В этой конструкции могут отсутствовать блоки catch или блок finally, но не то и другое одновременно. В C# разрешается опускать имя объекта- исключения в catch, если он не используется при обработке соответствующей исключительной ситуации.

public class A
{
  public static void main(String[] args)
  {
    try {
      if(args.length > 0)
        System.out.println
     ("Some arguments are specified");
      else throw new 
        IllegalArgumentException
        ("No arguments specified");
    }
    catch(RuntimeException e)
    {
      System.out.println
        ("Exception caught");
      System.out.println
        ("Exception type is " + 
           e.getClass().getName());
      System.out.println
        ("Exception message is \"" +
           e.getMessage() + "\"");
    }
    finally
    {
      System.out.println
        ("Performing finalization");
    }
  }
}
using System;

public class A
{
  public static void Main(string[] args)
  {
    try {
      if(args.Length > 0)
        Console.WriteLine
     ("Some arguments are specified");
      else throw new 
        ArgumentException
        ("No arguments specified");
    }
    catch(Exception e)
    {
      Console.WriteLine
        ("Exception caught");
      Console.WriteLine
        ("Exception type is " + 
          e.GetType().FullName);
      Console.WriteLine
        ("Exception message is \"" +
          e.Message + "\"");
    }
    finally
    {
      Console.WriteLine
        ("Performing finalization");
    }
  }
}

В Java, начиная с версии 1.4, появилась инструкция assert, предназначенная для выдачи отладочных сообщений.

Эта инструкция имеет один из двух видов:

assert expression ;
assert expression : expression_s ;

Выражение expression должно иметь логический тип, а выражение expression_s — произвольный.

Проверка таких утверждений может быть выключена. Тогда эта инструкция ничего не делает, и значения входящих в нее выражений не вычисляются.

Если проверка утверждений включена, то вычисляется значение expression. Если оно равно true, управление переходит дальше, иначе в обоих случаях выбрасывается исключение java.lang.AssertionError.

Во втором случае еще до выброса исключения вычисляется значение выражения expression_s, оно преобразуется в строку и записывается в качестве сообщения в создаваемое исключение.

В C# имеется возможность использовать инструкцию goto. Эта инструкция передает управления на инструкцию, помеченную меткой, которая следует за goto.

Как мы уже видели, помимо обычных меток, в goto могут использоваться метки case вместе со значениями и метка default. В этих случаях инструкция goto должна находиться внутри блока switch, в котором имеются эти метки.

При выходе с помощью goto из блока try или блока catch, у которых имеется соответствующий блок finally, сначала выполняется содержимое этого блока finally.

Ключевые слова checked и unchecked в C# могут помечать блок, определяя тем самым контекст вычислений в рамках этого блока (см. раздел о целочисленных типах).

Инструкция using может быть использована в C#, чтобы выполнить действия, требующие захвата каких-либо ресурсов, без необходимости заботиться потом об их освобождении.

Эта инструкция имеет вид:

using ( expression ) statement или
using ( declaration ) statement

где declaration — это декларация одной или нескольких переменных.

Первый вид этой инструкции сводится ко второму — если тип используемого выражения T, и имя v нигде не используется, то он эквивалентен

using ( T v = expression ) statement
Эта конструкция, в свою очередь, эквивалентна следующей.
{
  T v = expression;
  try { statement }
  finally { disposal }
}

Здесь disposal представляет вызов метода Dispose(), который должен быть у типа T, с возможной предварительной проверкой того, что переменная v не равна null, и приведением ее к типу System.IDisposable, если T является его подтипом.

В версии 2.0 в C# введены две инструкции yield, предназначенные для более удобного построения итераторов.

Блок, содержащий инструкцию yield, называется итерационным (iterator block) и может быть телом метода, оператора или метода доступа к свойству и не должен быть блоком finally, catch или блоком try, у которого есть соответствующие catch-блоки. Этот блок порождает последовательность значений одного типа. Сам метод или оператор должен возвращать объект одного из четырех типов:

System.Collections.IEnumerable,
System.Collections.IEnumerator,
System.Collections.Generic.IEnumerable <T>, 
System.Collections.Generic.IEnumerator <T>.

В первых двух случаях порождаются объекты типа object, во вторых двух — значения типа T.

Для возвращения одного из этой последовательности значений используется инструкция yield return expression; Выражение в ней должно иметь соответствующий тип, object или T.

Для указания на то, что порождаемая итерационным блоком последовательность значений завершилась, используется инструкция yield break;

Пример реализации итератора коллекции с использованием yield приведен ниже.

using System;

public class MyArrayList<T>
{
  T[] items = new T[10];
  int size = 0;

  public int Count 
  { get { return size; } }

  public T this[int i]
  {
    get
    {
      if(i < 0 || i >= size) throw new
        IndexOutOfRangeException();
      else return items[i]; 
    }
    set 
    {
      if(i < 0 || i > size) throw new
        IndexOutOfRangeException();
      else if (i == size)
      {
        T[] newItems =
          new T[size + 10];
        Array.Copy
          (items, newItems, size++);
      }
      items[i] = value; 
    }
  }


  public IEnumerator<T> GetEnumerator
   ()
  {
    for(int i = 0; i < size; i++)
      yield return items[i];
  }
}

public class A
{
  public static void Main()
  {
    MyArrayList<string> l =
      new MyArrayList<string>();


    l[0] = "First";
    l[1] = "Second";
    l[2] = "Third";

    foreach (string s in l)
      Console.WriteLine(s);
  }
}

Инструкции обоих языков, предназначенные для синхронизации работы нескольких потоков, рассматриваются в следующей лекции, в разделе, посвященном разработке многопоточных программ.

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?