- •Аннотация
- •Лекция 1. Что такое Java? История создания.
- •1. Что такое Java?
- •2. История создания Java
- •2.1. Сложности внутри Sun Microsystems
- •2.2. Проект Green
- •2.3. Компания FirstPerson
- •2.4. World Wide Web
- •2.5. Возрождение Oak
- •2.6. Java выходит в свет
- •3. История развития Java
- •3.1. Браузеры
- •3.2. Сетевые компьютеры
- •3.3. Платформа Java
- •4. Заключение
- •5. Контрольные вопросы
- •Аннотация
- •1. Основы объектно-ориентированного программирования
- •1.1. Методология процедурно-ориентированного программирования
- •1.2. Методология объектно-ориентированного программирования
- •1.3. Объекты
- •1.3.1. Состояние.
- •1.3.2. Поведение
- •1.3.3. Уникальность
- •1.4. Классы
- •1.4.1. Инкапсуляция
- •1.4.2. Полиморфизм
- •1.5. Типы отношений между классами
- •1.5.1. Агрегация
- •1.5.2. Ассоциация
- •1.5.3. Наследование
- •1.5.4. Метаклассы
- •1.6. Достоинства ООП
- •1.7. Недостатки ООП
- •1.8. Заключение
- •1.9. Контрольные вопросы
- •Аннотация
- •Лекция 3. Лексика языка
- •1. Лексика языка
- •1.1. Кодировка
- •1.2. Анализ программы
- •1.2.1. Пробелы
- •1.2.2. Комментарии
- •1.2.3. Лексемы
- •1.3. Виды лексем
- •1.3.1. Идентификаторы
- •1.3.2. Ключевые слова
- •1.3.3. Литералы
- •1.3.3.1. Целочисленные литералы
- •1.3.3.2. Дробные литералы
- •1.3.3.3. Логические литералы
- •1.3.3.4. Символьные литералы
- •1.3.3.5. Строковые литералы
- •1.3.3.6. Null литерал
- •1.3.3.7. Разделители
- •1.3.3.8. Операторы
- •1.3.3.9. Заключение
- •1.4. Дополнение: Работа с операторами
- •1.4.1. Операторы присваивания и сравнения
- •1.4.2. Арифметические операции
- •1.4.3. Логические операторы
- •1.4.4. Битовые операции
- •1.5. Заключение
- •1.6. Контрольные вопросы
- •Аннотация
- •Лекция 4. Типы данных
- •1. Введение
- •2. Переменные
- •3. Примитивные и ссылочные типы данных
- •3.1. Примитивные типы
- •3.2. Целочисленные типы
- •4. Дробные типы
- •5. Булевский тип
- •6. Ссылочные типы
- •6.1. Объекты и правила работы с ними
- •6.2. Класс Object
- •6.3. Класс String
- •6.4. Класс Class
- •7. Заключение
- •8. Заключение
- •9. Контрольные вопросы
- •Аннотация
- •Лекция 5. Имена. Пакеты
- •1. Введение
- •2. Имена
- •2.1. Простые и составные имена. Элементы.
- •2.2. Имена и идентификаторы
- •2.3. Область видимости (введение)
- •3. Пакеты
- •3.1. Элементы пакета
- •3.2. Платформенная поддержка пакетов
- •3.3. Модуль компиляции
- •3.3.1. Объявление пакета
- •3.3.2. Импорт-выражения
- •3.3.3. Объявление верхнего уровня
- •3.4. Уникальность имен пакетов
- •4. Область видимости имен
- •4.1. "Затеняющее" объявление (Shadowing)
- •4.2. "Заслоняющее" объявление (Obscuring)
- •5. Соглашения по именованию
- •6. Заключение
- •7. Контрольные вопросы
- •Аннотация
- •Лекция 6. Объявление классов
- •1. Введение
- •2. Модификаторы доступа
- •2.1. Предназначение модификаторов доступа
- •2.2. Разграничение доступа в Java
- •3. Объявление классов
- •3.1. Заголовок класса
- •3.2. Тело класса
- •3.3. Объявление полей
- •3.4. Объявление методов
- •3.5. Объявление конструкторов
- •3.6. Инициализаторы
- •4. Дополнительные свойства классов
- •4.1. Метод main
- •4.2. Параметры методов
- •4.3. Перегруженные методы
- •5. Заключение
- •6. Контрольные вопросы
- •Аннотация
- •Лекция 7. Преобразование типов
- •1. Введение
- •2. Виды приведений
- •2.1. Тождественное преобразование
- •2.2. Преобразование примитивных типов (расширение и сужение)
- •2.3. Преобразование ссылочных типов (расширение и сужение)
- •2.4. Преобразование к строке
- •2.5. Запрещенные преобразования
- •3. Применение приведений
- •3.1. Присвоение значений
- •3.2. Вызов метода
- •3.3. Явное приведение
- •3.4. Оператор конкатенации строк
- •3.5. Числовое расширение
- •3.5.1. Унарное числовое расширение
- •3.5.2. Бинарное числовое расширение
- •4. Тип переменной и тип ее значения
- •5. Заключение
- •6. Контрольные вопросы
- •Аннотация
- •1. Введение
- •2. Статические элементы
- •3. Ключевые слова this и super
- •4. Ключевое слово abstract
- •5. Интерфейсы
- •5.1. Объявление интерфейсов
- •5.2. Реализация интерфейса
- •5.3. Применение интерфейсов
- •6. Полиморфизм
- •6.1. Поля
- •6.2. Методы
- •6.3. Полиморфизм и объекты
- •7. Заключение
- •8. Контрольные вопросы
- •Аннотация
- •Лекция 9. Массивы
- •1. Введение
- •2. Массивы, как тип данных в Java
- •2.1. Объявление массивов
- •2.2. Инициализация массивов
- •2.3. Многомерные массивы
- •2.4. Класс массива
- •3. Преобразование типов для массивов
- •3.1. Ошибка ArrayStoreException
- •3.2. Переменные типа массив, и их значения
- •4. Клонирование
- •4.1. Клонирование массивов
- •5. Заключение
- •6. Контрольные вопросы
- •Аннотация
- •Лекция 10. Операторы и структура кода
- •1. Управление ходом программы
- •2. Нормальное и прерванное выполнение операторов
- •3. Блоки и локальные переменные
- •4. Пустой оператор
- •5. Метки
- •6. Оператор if
- •7. Оператор switch
- •8. Управление циклами
- •8.1. Цикл while
- •8.2. Цикл do
- •8.3. Цикл for
- •9. Операторы break и continue
- •9.1. Оператор continue
- •9.2. Оператор break
- •10. Именованные блоки
- •11. Оператор return
- •12. Оператор synchronized
- •13.1. Причины возникновения ошибок
- •13.2. Обработка исключительных ситуаций
- •13.2.1. Конструкция try-catch
- •13.2.2. Конструкция try-catch-finally
- •13.3. Использование оператора throw
- •13.4. Обрабатываемые и необрабатываемые исключения
- •13.5. Создание пользовательских классов исключений
- •13.6. Переопределение методов и исключения
- •13.7. Особые случаи
- •14. Заключение
- •15. Контрольные вопросы
- •Аннотация
- •Лекция 11. Пакет java.awt
- •1. Введение
- •2. Апплеты
- •2.1. Тег HTML <Applet>
- •2.2. Передача параметров
- •2.3. Контекст апплета
- •2.4. Отладочная печать
- •2.5. Порядок инициализации апплета
- •2.6. Перерисовка
- •2.7. Задание размеров графических изображений
- •2.8. Простые методы класса Graphics
- •2.9. Цвет
- •2.9.1. Методы класса Color
- •2.10. Шрифты
- •2.10.1. Использование шрифтов
- •2.10.2. Позиционирование и шрифты: FontMetrics
- •2.10.3. Использование FontMetrics
- •2.10.4. Центрирование текста
- •3. Базовые классы
- •4. Основные компоненты
- •5. Менеджеры компоновки
- •6. Окна
- •7. Меню
- •8. Обработка событий
- •8.1. Рисование "каракулей" в Java
- •8.2. Рисование "каракулей" с использованием встроенных классов
- •9. Заключение
- •10. Контрольные вопросы
- •Аннотация
- •Лекция 12. Потоки выполнения. Синхронизация
- •1. Введение
- •2. Многопоточная архитектура
- •3. Базовые классы для работы с потоками
- •3.1. Класс Thread
- •3.2. Интерфейс Runnable
- •3.3. Работа с приоритетами
- •3.4. Демон-потоки
- •4. Синхронизация
- •4.1. Хранение переменных в памяти
- •4.2. Модификатор volatile
- •4.3. Блокировки
- •5. Методы wait(), notify(), notifyAll() класса Object
- •6. Контрольные вопросы
- •Аннотация
- •Лекция 13. Пакет java.lang.
- •1. Введение
- •2. Object
- •3. Class
- •4. Wrapper Classes
- •4.1. Integer
- •4.2. Character
- •4.3. Boolean
- •4.4. Void
- •5. Math
- •6. Строки
- •6.1. String
- •6.2. StringBuffer
- •7. Системные классы
- •7.1. ClassLoader
- •7.2. SecurityManager - менеджер безопасности
- •7.3. System
- •7.4. Runtime
- •7.5. Process
- •8. Потоки исполнения
- •8.1. Runnable
- •8.2. Thread
- •8.3. ThreadGroup
- •9. Исключения
- •10. Заключение
- •11. Контрольные вопросы
- •Аннотация
- •Лекция 14. Пакет java.util
- •1. Введение
- •2. Работа с датами и временем
- •2.1. Класс Date
- •2.2. Классы Calendar и GregorianCalendar
- •2.3. Класс TimeZone
- •2.4. Класс SimpleTimeZone
- •3. Интерфейс Observer и класс Observable
- •4. Коллекции
- •4.1. Интерфейсы
- •4.1.1. Интерфейс Collection
- •4.1.2. Интерфейс Set
- •4.1.3. Интерфейс List
- •4.1.4. Интерфейс Map
- •4.1.5. Интерфейс SortedSet
- •4.1.6. Интерфейс SortedMap
- •4.1.7. Интерфейс Iterator
- •4.2. Aбстрактные классы используемые при работе с коллекциями.
- •4.3. Конкретные классы коллекций
- •4.4. Класс Collections
- •5. Класс Properties
- •6. Интерфейс Comparator
- •7. Класс Arrays
- •8. Класс StringTokenizer
- •9. Класс BitSet
- •10. Класс Random
- •11. Локализация
- •11.1. Класс Locale
- •11.2. Класс ResourceBundle
- •12. Заключение
- •13. Контрольные вопросы
- •Аннотация
- •Лекция 15. Пакет java.io
- •1. Система ввода/вывода. Потоки данных (stream)
- •1.1. Классы InputStream и OutputStream
- •1.2. Классы-реализации потоков данных
- •1.2.1. Классы ByteArrayInputStream и ByteArrayOutputStream
- •1.2.2. Классы FileInputStream и FileOutputStream
- •1.2.3. PipedInputStream и PipedOutputStream
- •1.2.4. StringBufferInputStream
- •1.2.5. SequenceInputStream
- •1.3. Классы FilterInputStreeam и FilterOutputStream. Их наследники.
- •1.3.1. BufferedInputStream и BufferedOutputStream
- •1.3.2. LineNumberInputStream
- •1.3.3. PushBackInputStream
- •1.3.4. PrintStream
- •1.3.5. DataInputStream и DataOutputStream
- •2. Serialization
- •2.1. Версии классов
- •3. Классы Reader и Writer. Их наследники.
- •4. Класс StreamTokenizer
- •5. Работа с файловой системой.
- •5.1. Класс File
- •5.2. Класс RandomAccessFile
- •6. Заключение
- •7. Контрольные вопросы
- •Аннотация
- •Лекция 16. Введение в сетевые протоколы
- •1. Основы модели OSI
- •2. Physical layer (layer 1)
- •3. Data layer (layer 2)
- •3.1. LLC sublayer.
- •3.2. MAC sublayer.
- •4. Network layer (layer 3)
- •4.1. Class A
- •4.2. Class B
- •4.3. Class CClass DClass E
- •5. Transport layer (layer 4)
- •6. Session layer (layer 5)
- •7. Presentation layer (layer 6)
- •8. Application layer (layer 7)
- •9. Утилиты для работы с сетью
- •9.1. IPCONFIG (IFCONFIG)
- •9.3. Ping
- •9.4. Traceroute
- •9.5. Route
- •9.6. Netstat
- •9.7. Задания для практического занятия
- •10. Пакет java.net
- •11. Заключение
- •12. Контрольные вопросы
Стр. 34 из 51 |
Создание пользовательских классов исключений |
}
catch(IOException ioe){
…
}
catch(UserExcetion ue){
…
}
В данном примере при возникновении исключительной ситуации (класс которой порожден от Exception) будет выполняться всегда только первый блок catch. Остальные не будут выполнены ни при каких условиях. Эта ситуация отслеживается компилятором, который сообщает об UnreachableCodeException (ошибка - недостижимый код). Правильно данная конструкция будет выглядеть так
try{
…
}
catch(UserExcetion ue){
…
}
catch(IOException ioe){
…
}
catch(Exception e){
…
}
В этом случае будет произведена последовательная обработка исключений. И в случае если не предусмотрена обработка того типа исключения, которое возникло (например, AnotherUserException), будет выполнен блок catch(Exception e){…}
Если срабатывает один из блоков catch, то остальные блоки в данной конструкции try-catch выполняться не будут.
13.5. Создание пользовательских классов исключений
Как уже отмечалось ранее, допускается создание собственных классов исключений. Для этого достаточно создать свой класс, унаследовав его от любого класса являющегося дочерним по отношению к ajav.lang.Throwable. (Или от самого Throwable)
Пример.
public class UserException extends Exception{ public UserException(){
super();
}
public UserException(String descry){ super(descr);
}
}
Программирование на Java
Rendered by www.RenderX.com
Стр. 35 из 51
соответственно возбуждаться данное исключение будет следующим образом:
throw new UserException("Дополнительное описание");
Рассмотрим другой пример. В языке С существует конструкция assert, которая зачастую используется для целей отладки. Рассмотрим как в JAVA можно воспроизвести подобную конструкцию с помощью механизма исключений.
public class AssertionException extends RuntimeException{
public AssertionException(){ super("Asertion Exception");
}
public AssertionException(String descr){ super(descr);
}
}
public class Assertion {
public static Boolean ASSERTION_ON = true;
private Assertion(){};
public static void assert(boolean flag) throws AssertionException{ if(ASSERTION_ON && flag){
throw new AssertionException()
}
}
public static void assert(boolean flag,Sring msg) throws AssertionException{
if(ASSERTION_ON && flag){
throw new AssertionException(msg)
}
}
}
Основная идея использования данного класса заключается в том, что бы в критичных участках программы встроить проверку некоторых граничных условий и, в случае их невыполнения возбуждать исключительную ситуацию.
Например
Assertion.assert(x <= xMinValue,"X too large");
В данном случае, если величина переменной x будет меньше некоего минимума будет возбуждена исключительная ситуация AssertionException. Т.к. это необрабатываемое
Программирование на Java
Rendered by www.RenderX.com
Стр. 36 из 51 |
Переопределение методов и исключения |
исключение, то использование блока try{} catch() не является обязательным. Однако, если мы все таки обработаем эту исключительную ситуацию, то можем выдать (например на консоль, или в лог-файл) сообщение об ошибке.
try{
…
// вызов кода использующего Assertion
…
}cacth(AssertionException ae){ System.err.println(ae);
}
13.6. Переопределение методов и исключения
При переопределении методов следует помнить что, если переопределяемый метод возбуждает исключение, то переопределяющий метод не может расширять класс этих исключений. Рассмотрим пример
public class BaseClass{
public void method () throws IOException{
...
}
}
public class LegalOne extends BaseClass{ public void method () throws IOException{
...
}
}
public class LegalTwo extends BaseClass{ public void method () {
...
}
}
public class LegalTree extends BaseClass{ public void method ()
throws EOFException,MalformedURLException {
...
}
}
public class IllegalOne extends BaseClass{ public void method ()
throws IOException,IllegalAccessException {
...
Программирование на Java
Rendered by www.RenderX.com
Стр. 37 из 51
}
}
public class IllegalTwo extends BaseClass{ public void method () {
...
throw new Exception();
}
}
в данном случае
определение класса LegalOne будет корректным, т.к. переопределение метода method() будет верным.
определение класса LegalTwo будет корректным, т.к. переопределение метода method() будет верным. (Переопределяемый метод не возбуждает исключений и поэтому не создает конфликта с переопределяемым методом)
определение класса LegalTree будет корректным, т.к. переопределение метода method() будет верным. (Метод может возбуждать исключения, которые являются подклассами исключения возбуждаемого в переопределяемом методе)
определение класса IlegalOne будет некорректным, т.к. переопределение метода method()
неверно. (IllegalAccessException не является подклассом IOException)
определение класса IlegalTwo будет некорректным, method() переопределен верно, но он возбуждает исключение не указанное в throws.
13.7. Особые случаи
Во время исполнения кода могут возникать ситуации, которые редко или вообще не описаны в литературе.
Рассмотрим такую ситуацию.
import java.io.*; public class Test {
public Test() {
}
public static void main(String[] args) { Test test = new Test();
try { test.doFileInput("bogus.file");
}
catch (IOException ex) {
System.out.println("Second exception hadle starck trace"); ex.printStackTrace();
}
}
Программирование на Java
Rendered by www.RenderX.com
Стр. 38 из 51 |
Ошибки при работе программы. Исключения (Exceptions). |
private String doFileInput(String fileName) throws FileNotFoundException,IOException{
String retStr = ""; java.io.FileInputStream fis = null; try {
fis = new java.io.FileInputStream(fileName);
}
catch (FileNotFoundException ex) {
System.out.println("First exception hadle starck trace"); ex.printStackTrace();
throw ex;
}
return retStr;
}
}
Результат работы будет выглядеть следующим образом.
java.io.FileNotFoundException: bogus.file (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:64) at experiment.Test.doFileInput(Test.java:33)
at experiment.Test.main(Test.java:21) First exception hadle starck trace
java.io.FileNotFoundException: bogus.file (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:64) at experiment.Test.doFileInput(Test.java:33)
at experiment.Test.main(Test.java:21) Second exception hadle starck trace
Так как при вторичном возбуждении используется один и тот же один объект Exception, то стек в обоих случаях будет содержать одну и ту же последовательность вызовов. Т.е. при повторном возбуждении исключения, если мы используем тот же объект, изменения его параметров не происходит.
Рассмотрим другой пример.
import java.io.*;
public class Test {
public Test() {
}
public static void main(String[] args) { Test test = new Test();
try { test.doFileInput();
Программирование на Java
Rendered by www.RenderX.com
Стр. 39 из 51
}
catch (IOException ex) {
System.out.println("Exception hash code " + ex.hashCode()); ex.printStackTrace();
}
}
private String doFileInput() throws FileNotFoundException,IOException{ String retStr = "";
java.io.FileInputStream fis = null; try {
fis = new java.io.FileInputStream("bogus.file");
}
catch (FileNotFoundException ex) { System.out.println("Exception hash code " + ex.hashCode()); ex.printStackTrace();
fis = new java.io.FileInputStream("anotherBogus.file"); throw ex;
}
return retStr;
}
}
java.io.FileNotFoundException: bogus.file (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:64) at experiment.Test.doFileInput(Test.java:33)
at experiment.Test.main(Test.java:21) Exception hash code 3214658
java.io.FileNotFoundException: (The system cannot find the path specified) at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:64) at experiment.Test.doFileInput(Test.java:38)
at experiment.Test.main(Test.java:21) Exception hash code 6129586
Несложно заметить, что, несмотря на то, что последовательность вызовов одна и та же, в вызываемом методе и вызывающем обрабатываются разные объекты исключений.
Здесь следует обратить внимание, что если при обработке исключения произойдет в свою очередь новое исключение и оно не будет обработано в данном методе, то собственно информация об исключении, которое послужило первоисточником нештатной ситуации будет утеряно и информация о нем в вызывающий метод передана не будет. В случае, если в коде обрабатывающем исключение тоже может возникнуть внештатная ситуация, следует использовать вложенные блоки try{} catch(). Если преобразовать код к следующему виду, то программа будет вести себя ожидаемым образом.
Программирование на Java
Rendered by www.RenderX.com
Стр. 40 из 51 |
Ошибки при работе программы. Исключения (Exceptions). |
import java.io.*;
public class Test {
public Test() {
}
public static void main(String[] args) { Test test = new Test();
try { test.doFileInput();
}
catch (IOException ex) {
System.out.println("Exception hash code " + ex.hashCode()); ex.printStackTrace();
}
}
private String doFileInput() throws FileNotFoundException,IOException{ String retStr = "";
java.io.FileInputStream fis = null; try {
fis = new java.io.FileInputStream("bogus.file");
}
catch (FileNotFoundException ex) { try {
System.out.println("Exception hash code " + ex.hashCode()); ex.printStackTrace();
fis = new java.io.FileInputStream("");
}
catch (FileNotFoundException ex2) {
}
throw ex;
}
return retStr;
}
}
java.io.FileNotFoundException: bogus.file (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:64) at experiment.Test.doFileInput(Test.java:24)
at experiment.Test.main(Test.java:12)
Exception hash code 3214658
java.io.FileNotFoundException: bogus.file (The system cannot find the file specified)
Программирование на Java
Rendered by www.RenderX.com