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);
}
}
|