К. Арнольд, Д. Гослинг - Язык программирования Java (1160779), страница 7
Текст из файла (страница 7)
Методы, находящиеся дальше в стеке выполнения, могут перехватить новое исключение и должным образом прореагировать на него.Если выполнение метода может привести к возникновению проверяемых исключений, последние должны быть объявлены после ключевогослова throws, как показано на примере метода averageOf. Если не считать исключений RuntimeException и Error, а также подклассов этих типовисключений, которые могут возбуждаться в любом месте программы, метод возбуждает лишь объявленные в нем исключения — как прямо,посредством оператора throw, так и косвенно, вызовом других методов, возбуждающих исключения.Объявление исключений, которые могут возбуждаться в методе, позволяет компилятору убедиться, что метод возбуждает только этиисключения и никакие другие. Подобная проверка предотвращает ошибки в тех случаях, когда метод должен обрабатывать исключения отдругих методов, однако не делает этого.
Кроме того, метод, вызывающий ваш метод, может быть уверен, что это не приведет к возникновениюнеожиданных исключений. Именно поэтому исключения, которые должны быть объявлены после ключевого слова throws, называютсяпроверяемыми исключениями. Исключения, являющиеся расширениями RuntimeException и Error, не нуждаются в объявлении и проверке; ониназываются непроверяемыми исключениями.Упражнение 1.14Отредактируйте исключение IllegalAverageException так, чтобы в нем содержался массив и индексы и при перехвате этого исключения можнобыло узнать подробности ошибки.1.13.
ПакетыКонфликты имен становятся источником серьезных проблем при разработке повторно используемого кода. Как бы тщательно вы ни подбиралиимена для своих классов и методов, кто-нибудь может использовать это же имя для других целей. При использовании простых названийпроблема лишь усугубляется — такие имена с большей вероятностью будут задействованы кем-либо еще, кто также захочет пользоватьсяпростыми словами. Такие имена, как set, get, clear и т. д., встречаются очень часто, и конфликты при их использовании оказываются практическинеизбежными.Во многих языках программирования предлагается стандартное решение — использование “префикса пакета” перед каждым именем класса,типа, глобальной функции и так далее.
Соглашения о префиксах создают контекст имен (naming context), который предотвращает конфликтыимен одного пакета с именами другого. Обычно такие префиксы имеют длину в несколько символов и являются сокращением названия пакета —например, Xt для “X Toolkit” или WIN32 для 32-разрядного Windows API.Если программа состоит всего из нескольких пакетов, вероятность конфликтов префиксов невелика. Однако, поскольку префиксы являютсясокращениями, при увеличении числа пакетов вероятность конфликта имен повышается.В Java принято более формальное понятие пакета, в котором типы и субпакеты выступают в качестве членов. Пакеты являются именованными имогут импортироваться. Имена пакетов имеют иерархическую структуру, их компоненты разделяются точками.
При использовании компонентапакета необходимо либо ввести его полное имя, либо импортировать пакет — целиком или частично. Иерархическая структура имен пакетовпозволяет работать с более длинными именами. Кроме того, это дает возможность избежать конфликтов имен — если в двух пакетах имеютсяклассы с одинаковыми именами, можно применить для их вызова форму имени, в которую включается имя пакета.Приведем пример метода, в котором полные имена используются для вывода текущей даты и времени с помощью вспомогательного класса Javaс именем Date (о котором рассказано в главе 12):class Date1 {public static void main(String[] args) {java.util.Date now = new java.util.Date();System.out.println(now);}}Теперь сравните этот пример с другим, в котором для объявления типа Date используется ключевое слово import:import java.util.Date;class Date2 {public static void main(String[] args) {Date now = new Date();System.out.println(now);}}Пакеты Java не до конца разрешают проблему конфликтов имен.
Два различных проекта могут присвоить своим пакетам одинаковые имена. Этапроблема решается только за счет использования общепринятых соглашений об именах. По наиболее распространенному из таких соглашенийв качестве префикса имени пакета используется перевернутое имя домена организации в Internet. Например, если фирма Acme Corporationсодержит в Internet домен с именем acme.com, то разработанные ей пакеты будут иметь имена типа COM.acme.package.Точки, разделяющие компоненты имени пакета, иногда могут привести к недоразумениям, поскольку те же самые точки используются привызове методов и доступе к полям в ссылках на объекты.
Возникает вопрос — что же именно импортируется? Новички часто пытаютсяимпортировать объект System.out, чтобы не вводить его имя перед каждым вызовом println. Такой вариант не проходит, поскольку Systemявляется классом, а out — его статическим полем, тип которого поддерживается методом println.С другой стороны, java.util является пакетом, так что допускается импортирование java.util.Date (или java.util.*, если вы хотите импортировать всесодержимое пакета).
Если у вас возникают проблемы с импортированием чего-либо, остановитесь и убедитесь в том, что вы импортируете тип.Классы Java всегда объединяются в пакеты. Имя пакета задается в начале файла:package com.sun.games;class Card{// ...}// ...Если имя пакета не было указано в объявлении package, класс становится частью безымянного пакета. Хотя это вполне подходит дляприложения (или аплета), которое используется отдельно от другого кода, все классы, которые предназначаются для использования вбиблиотеках, должны включаться в именованные пакеты.1.14.
Инфраструктура JavaЯзык Java разработан так, чтобы обеспечивать максимальную переносимость. Многие аспекты Java определяются сразу для всех возможныхреализаций. Например, тип int всегда должен представлять собой 32-разрядное целое со знаком с дополнением по модулю 2. Во многих языкахпрограммирования точные определения типов являются уделом конкретной реализации; на уровне языка даются лишь общие гарантии, такиекак минимальный диапазон чисел данного типа или возможность системного запроса, позволяющего определить диапазон на даннойплатформе.В языке Java такие требования продвинуты вплоть до уровня машинного языка, на который транслируется текст программ. Исходный текстпрограммы на Java компилируется в байт-код, выполняемый на виртуальной машине Java.
Байт-код является универсальным языком, и именноон интерпретируется виртуальной машиной в каждой системе, поддерживающей Java. /Разумеется, виртуальная машина Java может бытьреализована и на аппаратном уровне - то есть с использованием специализированных микросхем. Это никак не влияет на переносимость байткода и является всего лишь одним из видов реализации виртуальной машины. - Примеч. перев/Виртуальная машина присваивает каждому приложению собственный контекст времени выполнения (runtime), который одновременноизолирует приложения друг от друга и обеспечивает безопасность работы. Менеджер безопасности каждого контекста времени выполненияопределяет, какие возможности доступны данному приложению. Например, менеджер безопасности может запретить приложению чтение илизапись на локальный диск или ограничить сетевые соединения строго определенными компьютерами.В совокупности все эти средства делают язык Java полностью платформонезависимым и предоставляют схему безопасности для выполненияпереданного по сети кода на различных уровнях доверия (trust levels).
Исходный текст Java, скомпилированный в байт-код Java, можетвыполняться на любом компьютере, где имеется виртуальная машина Java. Код может выполняться на соответствующем уровне защиты, чтобыпредотвратить случайное или злонамеренное повреждение системы. Уровень доверия регулируется в зависимости от источника байт-кода —байт-код на локальном диске или в защищенной сети пользуется большим доверием, чем байт-код, полученный с удаленного компьютера,неизвестно даже где расположенного.1.15. ПрочееJava содержит ряд других возможностей, которые кратко упоминаются здесь и рассматриваются в следующих главах:●●●●Потоки: Java обладает встроенной поддержкой потоков для создания многопоточных приложений.
Для синхронизации параллельногодоступа к объектам и данным класса используется блокировка на уровне объектов и на уровне классов. Подробности приведены вглаве 9.Ввод/вывод: Java содержит пакет java.io, предназначенный для выполнения разнообразных операций ввода/вывода. Конкретныевозможности ввода/вывода описаны в главе 11.Классы общего назначения: в состав Java входят классы, представляющие многие примитивные типы данных (такие, как Integer, Double иBoolean), а также класс Class для работы с различными типами классов. Программирование с использованием типов рассматривается вглаве 13.Вспомогательные классы и интерфейсы: Java содержит пакет java.util со множеством полезных классов — таких, как BitSet, Vector, Stack иDate. Более подробно о вспомогательных классах рассказывается в главе 12.Содержание | Далее© 1997-2002 Издательский дом "Питер".
Авторские права охраняются.Предназначено только для частного использования!Воспроизведение материалов или частей данной книги в любом виде без письменного разрешения Издательского дома "Питер" запрещено!Глава 8СТРОКИЧто толку в хорошей цитате, если ее нельзя изменить?Доктор Who, The Two DoctorsСтроки в Java являются стандартными объектами со встроенной языковой поддержкой. Нам уже встречалось множество примеров того, какстроковые объекты создаются на основе литералов; кроме того, мы видели, как операторы + и += применяются для конкатенации и созданияновых строк.