Исключительные ситуации.
Методы.
Массивы.
Работа с массивами в Java существенно отличается от C/C++. Основное отличие состоит в том, что массив по сути представляет собой объект. Поэтому, для того чтобы создать массив, надо не только объявить переменную, но и выполнить оператор new.
Переменная, содержащая ссылку на массив, объявляется следующим образом:
тип имя_переменной [];
Как и при объявлении обычной переменной, перед определением типа могут быть указаны модификаторы static, final, public и т. д.
Для создания массива используется следующее выражение:
имя_переменной=new тип [размер];
В результате выполнения данного выражения создается массив, содержащий указанное число элементов, и ссылка на него помещается в переменную с заданным именем.
Методы Java почти не отличаются от функций-членов C. Объявление метода выглядит следующим образом:
[модификаторы] возвращаемое_значение имя_метода ([список_параметров]) [throws список_исключений]
{
тело_метода
}
Назначение некоторых модификаторов описано ниже.
· Модификатор типа доступа определяет, из каких классов может производиться обращение к методу. Как и в случае переменных, на первых этапах изучения языка вам достаточно запомнить модификатор public, допускающий вызов метода из-за пределов пакета.
· Модификатор static определяет метод класса, или статический метод. В отличие от метода экземпляра, метод класса можно вызвать, даже если ни один экземпляр данного класса не был создан.
· Модификатор abstract определяет абстрактный метод. Абстрактный метод должен обязательно быть переопределен в подклассе данного класса. Класс, содержащий хотя бы один абстрактный метод, является абстрактным классом; экземпляр такого класса не может быть создан.
В определении метода может присутствовать ключевое слово throws, сопровождаемое списком исключений. Исключения, или исключительные ситуации — чрезвычайно важный механизм, не владея которым практически невозможно построить приложение или апплет, выполняющие полезные действия.
В процессе работы программы могут возникать ситуации, нарушающие нормальный ход вычислений: деление на нуль, ошибка обмена, ошибка при обращении по сети, попытка создать экземпляр абстрактного класса и т. д. Такие ситуации принято называть исключительными ситуациями, или исключениями.
По умолчанию в подобных случаях интерпретатор Java выводит сообщение, описывающее исключительную ситуацию, и завершает работу программы.
Учитывая, что ряд Java-программ выполняется под управлением других систем, становится ясно, что описанная реакция на возникновение исключительных ситуаций не всегда приемлема. Чтобы изменить порядок обработки исключений, надо при создании программы принять описанные ниже меры.
Фрагменты кода, которые могут генерировать исключительные ситуации, следует поместить в блок try следующего формата:
try
{
…
Последовательность команд
…
}
Непосредственно за блоком try должен размещаться как минимум один блок catch, который выглядит так:
catch (описание_исключения)
{
…
Команды обработки исключительной ситуации
…
}
При нормальной работе программы наличие блока try никак не сказывается на её выполнении. По завершении фрагмента, предшествующего блоку try, управление передается внутрь блока, а после того как все команды внутри блока будут выполнены, управление перейдет к первой команде, следующей после блока catch.
Для каждой категории исключительных ситуаций предусмотрен специальный класс, содержащий описания исключений. Так, например, арифметические ошибки описываются классом ArithmeticException, некорректная попытка создания объекта URL - классом с названием MalformedURLException и т. д.
Классы, которые описывают интересующие нас исключительные ситуации, являются подклассами класса Exception. Класс Exception, в свою очередь, является подклассом класса Throwable.
Иерархическая структура, включающая некоторые (очень немногие) классы, описывающие исключительные ситуации, представлена ниже.
Exception
!
!-- IOException
! !
! !-- MalformedURLException
! !
! !-- UnknownHostException
! …
!
!-- RuntimeException
!
!-- ArithmeticException
!
…
Рассмотрим блок try, содержащий несколько команд, и блоки catch, предназначенные для обработки исключительных ситуаций.
try
{
…
sock=new Socket (www.myserver.com, 80};
…
a=b/d;
…
}
catch (UnknownHostException ex)
{
Обработка исключительной ситуации UnknownHostException
}
catch (IOException ex)
{
Обработка исключительной ситуации IOException
}
catch (ArithmeticException ex)
{
Обработка исключительной ситуации ArithmeticException
}
За блоком try следуют три блока catch. Конструктор класса Socket, вызываемый в блоке try, может генерировать исключения UnknownHostException и IOException, а при делении b/d, если значение d будет равно нулю, возникнет исключительная ситуация ArithmeticException. Каждое из этих исключений обрабатывается отдельным блоком catch.
Однако код программы можно существенно сократить. Три блока catch можно заменить одним блоком, представленным ниже.
catch (Exception ex)
{
Обработка исключительных ситуаций всех типов
}
Если при выполнении метода может возникнуть исключительная ситуация, которая не обрабатывается в теле метода, необходимо специально оговорить это в тексте программы. При объявлении такого метода следует указать ключевое слово throws, сопровождаемое перечнем имён классов, описывающих исключительные ситуации, которые могут возникнуть при работе метода.
Простейшее Java-приложение.
Сейчас мы рассмотрим исходный код и процедуру построения простейшего Java-приложения. Текст программы, действия которой ограничиваются выводом краткого сообщения, приведён ниже.
import java.lang.*;
class FirstApplication
{
public static void main (String args [])
{
System.out.println (“Моё первое Java-приложение”);
}
}
Рассмотрим исходный текст приложения. Первая строка исходного кода импортирует пакет java.lang, которому принадлежит класс System, используемый в работе приложения.
Рассмотрим метод main (). В его объявлении указаны модификаторы public и static. Модификатор public позволяет вызывать метод из-за пределов текущего пакета. Модификатор static объявляет main () как статический метод. Это необходимо, так как при вызове main () ни одного экземпляра класса FirstApplication ещё не существует.
При вызове метода main () ему передастся массив строковых значений, в котором содержатся параметры, заданные в командной строке. В нашем примере обработка параметров не предусмотрена.
Единственная команда, содержащаяся в теле метода, выводит на экран строку текста. Последовательность имен System.out.println означает следующее. В классе System определена переменная класса, или статическая переменная out. Она ссылается на экземпляр класса PrintStream, реализующий выходной поток. В классе PrintStream определён метод println (), который выводит на экран строку символов, переданную ему в качестве параметра, и дополнительно выводит символ перевода строки.
Зная теперь, как работает данное приложение, поговорим о том, что надо сделать, чтобы запустить его на выполнение. Начнем с выбора инструментальных средств.
В настоящее время разработчику предлагаются самые разнообразные инструментальные пакеты, в том числе визуальные средства разработки программ. Выбор конкретного пакета — дело вкуса каждого специалиста. Однако среди всего набора доступных средств разработки есть пакет JDK (Java Development Kit — инструментальный пакет разработки Java-программ), выполняющий роль стандарта. Байтовый код Java-программы подготавливается с помощью компилятора, а выполняется под управлением интерпретатора.
Компилятор, входящий в состав JDK, называется javac. Он вызывается из командной строки, а в качестве параметра ему передается имя файла, содержащего исходный код Java-программы. Если приведенный выше исходный текст хранится в файле FirstApplication.java, то команда вызова компилятора будет выглядеть следующим образом:
javac FirstApplication.java
При определении класса FirstApplication не был указан модификатор public, поэтому на имя файла не налагается ограничений и исходный код приложения может храниться в файле с любым именем.
По окончании работы компилятор создаст байтовый код программы и поместит его в файл с именем FirstApplication.class. При выборе имени для файла с байтовым кодом учитывается не имя исходного файла, а имя класса. Если вы поместите исходный код в файл с другим именем, в результате компиляции все равно будет создан файл с именем FirstApplication.class.
После завершения работы компилятора байтовый код готов к выполнению. Для запуска Java-программы необходим интерпретатор, реализующий виртуальную машину Java (JVM). Средства поддержки JVM имеются в любом современном Web-браузере, однако для запуска приложения вам придется воспользоваться интерпретатором из пакета JDK и именем java. Как и javac, интерпретатор запускается из командной строки, а в качестве параметра задается имя класса, содержащего метод main (). В данном случае это класс FirstApplication.
Как и следует ожидать, в результате выполнения данного приложения на экране отобразится строка символов «Моё первое Java-приложение».