Текст книги "Java: руководство для начинающих (ЛП)"
Автор книги: Герберт Шилдт
Жанр:
Программирование
сообщить о нарушении
Текущая страница: 2 (всего у книги 36 страниц)
Выполнение программы под управлением виртуальной машины помогает также обеспечить безопасность. Виртуальная машина может запретить программе выполнять операции, побочные эффекты которых способны повлиять на ресурсы за пределами исполняющей системы. Кроме того, безопасность достигается посредством некоторых ограничений, предусмотренных в языке Java.
Как правило, интерпретируемая программа выполняется медленнее, чем скомпилированная в машинный код. Но для кода Java отличия в быстродействии не очень существенны. Ведь байт-код оптимизирован, и поэтому программа выполняется под управлением виртуальной машины значительно быстрее, чем следовало бы ожидать.
Несмотря на то что Java был задуман как интерпретируемый язык, ничто не мешает преобразовать байт-код по ходу компиляции в собственный для повышения производительности. С этой целью сразу же после первой реализации JVM компания Sun Microsystems начала работу над технологией HotSpot, в рамках которой был разработан динамический компилятор байт-кода. Если в состав виртуальной машины входит динамический компилятор, байт-код по частям преобразуется в собственный исполняемый код. Преобразовывать сразу всю программу на Java в исполняемый код нецелесообразно из-за разнообразных проверок, которые могут производиться только на этапе выполнения программы. Поэтому динамический компилятор выполняет преобразования кода частями по мере необходимости (отсюда и его другое название – JIT-компилятор, т.е. компилятор, вступающий в действие лишь в нужный момент времени). Более того, компиляции подвергаются не все фрагменты байт-кода, а лишь те, скорость выполнения которых можно повысить благодаря компиляции, а остальной код интерпретируется. Несмотря на все ограничения, присущие динамической компиляции, она, тем не менее, позволяет существенно повысить производительность программ. И невзирая на динамическое преобразование байт-кода в исполняемый код, переносимость и защита сохраняются, поскольку JVM по-прежнему участвует в процессе выполнения программ. Основные свойства Java
Даже самый краткий обзор языка Java будет неполным без упоминания его основных свойств. И хотя главной причиной, побудившей к разработке Java, послужила потребность в языке, позволяющем создавать переносимые и защищенные программы, заметное влияние на оформление Java в окончательном виде оказали и другие факторы. Ниже вкратце перечислены основные свойств этого языка программирования. Простота Java обладает лаконичными, тесно связанными друг с другом и легко усваи¬ваемыми языковыми средствами Безопасность Предоставляет безопасные средства для создания интернет-приложений Переносимость Программы на Java могут выполняться в любой среде, для которой имеетсяисполняющая система Java Объектно-ориентированный характер Воплощает современную концепцию объектно-ориентированного програм¬мирования Надежность Стимулирует безошибочное программирование благодаря строгому кон¬тролю типов и проверкам во время выполнения программ Многопоточность Обеспечивает встроенную поддержку многопоточного программирования Архитектурная независимость Не привязан к конкретному типу вычислительной машины или архитектуре операционной системы Интерпретируемость Предоставляет байт-код, обеспечивающий независимость от платформы Высокая производительность Байт-код Java сильно оптимизирован на повышение скорости выполнения Распределенность Разработан для применения в распределенной среде Интернета Динамичность Программы на Java содержат значительную долю информации, используе¬мой во время выполнения для проверки и разрешения доступа к объектам Объектно-ориентированное программирование
Одним из главных свойств Java является поддержка объектно-ориентированного программирования (ОПП). Объектная методология неотделима от Java, а все программы на Java в той или иной степени являются объектно-ориентированными. Поэтому имеет смысл кратко рассмотреть принципы ООП, прежде чем переходить к написанию даже самой простой программы на Java.
Объектно-ориентированный подход к программированию позволяет разрабатывать достаточно сложные программы. С момента появления первого компьютера методология программирования претерпела ряд существенных изменений, связанных с возрастанием сложности программ. На заре вычислительной техники процесс программирования представлял собой ввод машинных команд в двоичной форме с пульта управления ЭВМ. В то время размеры программ не превышали нескольких сотен команд, и поэтому такой подход считался вполне приемлемым. Затем появился язык ассемблера. Символьное представление машинных команд и процедура компиляции позволили перейти к созданию более сложных программ. В связи с дальнейшим увеличением объема программного кода появились языки высокого уровня. Они стали теми инструментами, которые позволили программистам справиться с постепенным усложнением программ. Первым из широко распространенных языков высокого уровня стал FORTRAN. Разработка FORTRAN стала важным этапом в развитии языков программирования, но этот язык не вполне подходил для создания удобочитаемых программ.
В 1960-е годы начало зарождаться структурное программирование. Впоследствии для поддержки данного подхода был созданы такие языки, как С и Pascal. Благодаря структурированным языкам программирования появилась возможность очень просто создавать программы средней сложности. Главными свойствами структурированных языков стали поддержка независимых подпрограмм, локальных переменных, наличие расширенного набора управляющих конструкций и отсутствие оператора GOTO. Но, несмотря на то что структурированные языки стали мощными инструментами программирования, с увеличением объема и сложности проектов их возможности были быстро исчерпаны.
На каждом очередном этапе развития методологии и инструментальных средств программирования разработчики получали возможность создавать все более сложные программы. На этом пути очередной подход наследовал лучшие черты своих предшественников, а кроме того, он приобретал новые качества, позволявшие двигаться вперед. К моменту разработки принципов ООП многие проекты стали настолько сложными, что управлять ими средствами структурного программирования уже не представлялось возможным. Объектно-ориентированная методология позволила разработчикам преодолеть эти препятствия.
Создатели объектно-ориентированного программирования переняли лучшие идеи у структурного программирования и дополнили их новыми понятиями. В результате возник новый способ организации программ. В принципе программы могут создаваться двумя путями: на основе кода (выполняющего действия) и на основе данных (подвергающихся обработке). При использовании только принципов структурного программирования программы организуются на основе кода. Такой подход можно рассматривать как код, воздействующий на данные.
Объектно-ориентированное программирование подразумевает другой подход. Программы организуются на основе данных по следующему главному принципу: данные управляют доступом к коду. В объектно-ориентированных языках программирования определяются данные и процедуры, которым разрешается обрабатывать эти данные. Таким образом, тип данных определяет те операции, которые применимы к этим данным.
Во всех объектно-ориентированных языках программирования, в том числе и в Java, поддерживаются три основных принципа ООП: инкапсуляция, полиморфизм и наследование. Рассмотрим каждый из этих принципов в отдельности. Инкапсуляция
Инкапсуляция представляет собой механизм программирования, объединяющий код и данные, которыми он манипулирует. Он предотвращает несанкционированный доступ к данным извне и их некорректное использование. В объектно-ориентированных языках программирования код и данные организуются в некое подобие “черного ящика”. В результате такого объединения кода и данных создается объект. Иными словами, объект – это компонент, поддерживающий инкапсуляцию.
Данные и код внутри объекта могут быть закрытыми (private) или открытыми (public). Закрытый код или данные доступны только элементам, содержащимся в том же самом объекте. Поэтому обратиться к такому коду или данным вне пределов объекта невозможно. Если код или данные являются открытыми, то к ним можно обращаться из любой части программы (несмотря на то, что они находятся внутри объекта). Как правило, открытые элементы объекта используются для создания управляемого интерфейса к его закрытым элементам.
Основной языковой конструкцией, поддерживающей инкапсуляцию в Java, является класс. Классы будут подробнее рассматриваться далее в этой книге, но о них нужно сказать несколько слов уже теперь. Класс определяет тип объекта. В нем определяются как данные, так и код, выполняющий определенные действия над этими данными. В Java определение или так называемая спецификация класса служит для построения объектов. Объекты представляют собой экземпляры классов. Следовательно, класс – это ряд “чертежей”, по которым строится объект.
Код и данные в составе класса называются членами класса. Данные, определенные в составе класса, принято называть переменными-членами или переменными экземпляра, а код, выполняющий действия над этими данными, – методами-членами, или просто методами. Метод – это термин, которым в Java принято обозначать подпрограмму. Если вы знакомы с языками C/C++, то, вероятно, знаете, что в этих языках для той же самой цели служит термин функция. Полиморфизм
Полиморфизм (от греческого слова, означающего “много форм”) – это свойство, позволяющее с помощью одного интерфейса обращаться к общему ряду действий. Конкретное действие определяется ситуацией. В качестве примера, позволяющего лучше понять принцип полиморфизма, можно привести руль автомобиля. Руль (т.е. интерфейс) остается одним и тем же, независимо от того, какой именно механизм рулевого управления применяется в автомобиле, будь то зубчатая, реечная передача или гидроусилитель. Таким образом, зная, как обращаться с рулем, вы можете управлять автомобилем любого типа.
Тот же самый принцип применяется и в программировании. Рассмотрим в качестве примера стек (структуру данных, организованных по принципу “последним пришел – первым обслужен”). Допустим, в программе требуются три разнотипных стека. Первый стек служит для хранения целочисленных значений, второй – для хранения значений с плавающей точкой и третий – для хранения символьных значений. Каждый стек реализуется с помощью одного и того же алгоритма, несмотря на то, что в стеках хранятся разнотипные данные. На языке, не поддерживающем ООП, пришлось бы создавать три разных ряда процедур управления стеками, присвоив им разные имена. А на Java благодаря полиморфизму можно создать один общий ряд процедур управления стеками, который будет действовать по-разному в зависимости от конкретного типа стека. Таким образом, зная, как работать с одним стеком, можно обращаться со всеми тремя стеками.
Принцип полиморфизма хорошо иллюстрирует следующее выражение: “один интерфейс – множество методов”. Это означает возможность создания универсального интерфейса для группы взаимосвязанных действий. Полиморфизм упрощает программу благодаря возможности определить общий класс действий с помощью одного и того же интерфейса. Выбрать определенное действие (т.е. метод) – задача компилятора, и он решает ее в зависимости от конкретных условий. Как программисту вам не приходится выбирать метод вручную. Нужно лишь помнить основные принципы использования общего интерфейса. Наследование
Наследование – это процесс, в ходе которого один объект приобретает свойства другого объекта. Наследование имеет очень большое значение, поскольку с его помощью поддерживается иерархическая классификация. Если вдуматься, то знания чаще всего имеют иерархическую структуру. Например, яблоки конкретного сорта относятся к классу яблок, который в свою очередь относится к классу фруктов, а тот – к более обширному классу съедобных плодов. В данном случае съедобные плоды обладают определенными свойствами (они питательны, не ядовиты и т.д.). Эти же свойства автоматически присущи подклассу фруктов. Кроме того, класс фруктов обладает дополнительными свойствами (сочные, сладкие и т.д.), что отличает его от класса других съедобных плодов. Яблоки имеют более конкретные свойства (растут на деревьях, не являются тропическими плодами и т.д.) И наконец, отдельный сорт яблок наследует все свойства описанных выше классов и, кроме того, обладает особыми свойствами, отличающими его от других сортов яблок.
Без такой иерархической структуры для каждого объекта пришлось бы заново определять весь набор свойств. Благодаря наследованию для объекта достаточно указать те свойства, которые отличают его от других классов, а остальные общие атрибуты он наследует от своих родительских классов. Таким образом, благодаря наследованию возможно создать объект, являющийся экземпляром более общего класса. Установка комплекта Java Development Kit
Итак, усвоив теоретические основы Java, можно приступать к написанию программ на Java. Для того чтобы написанную программу можно было скомпилировать и запустить на выполнение, вам нужно установить на своем компьютере комплект Java Development Kit, поддерживающий процесс разработки программ на Java. Этот комплект свободно предоставляется компанией Oracle. На момент написания данной книги доступна была его версия JDK 7, применяемая на платформе Java SE 7, где SE – стандартная версия. Комплект JDK 7 содержит немало новых средств, которые не поддерживаются в предыдущих версиях Java, и поэтому для компиляции и выполнения примеров программ, представленных в этой книге, потребуется JDK 7 или более поздняя версия данного комплекта.
Комплект JDK можно загрузить по адресу www.oracle.com/technetwork/java/javase/downloads/index.html. Для этого достаточно перейти на страницу загрузки по указанному адресу и следовать инструкциям для вашего типа компьютера и операционной системы. После установки JDK вы сможете приступить к компиляции и запуску программ на выполнение. Среди многих программ, входящих в состав JDK, вам в первую очередь понадобятся две. Первая из них, javac, служит в качестве компилятора Java, а вторая, java, – в качестве стандартного интерпретатора Java и зачастую называется загрузчиком приложений.
Следует, однако, иметь в виду, что программы, входящие в состав JDK, запускаются из командной строки. Они не являются оконными приложениями и не составляют интегрированную среду разработки.
На заметку Помимо основных инструментальных средств JDK, доступных из командной строки, для разработки программ на Java имеются высококачественные интегрированные среды вроде NetBeans и Eclipse. Интегрированная среда может оказаться очень удобной для разработки и развертывания коммерческих приложений. Как правило, в интегрированной среде можно по желанию скомпилировать и выполнить примеры программ, представленных в этой книге. Но инструкции по компиляции и выполнению этих примеров программ приводятся в книге только для инструментальных средств JDK, доступных из командной строки, ради простоты усвоения по целому ряду причин. Во-первых, комплект JDK легко доступен для всех читателей книги. Во-вторых, инструкции по применению JDK одинаковы для всех пользователей. А кроме того, простые примеры программ, представленные в этой книге, проще всего компилировать и выполнять инструментальными средствами JDK из командной строки. Если же вы пользуетесь интегрированной средой разработки, вам придется следовать ее инструкциям. А в силу отличий, имеющихся у разных интегрированных сред разработки, дать общие инструкции по компиляции и выполнению программ, написанных на Java, не представляется возможным. Первая программа на Java
Попробуйте скомпилировать и запустить простую программу, исходный код которой приведен ниже. /* Это пример простой программы на Java. Присвоить ее исходному файлу имя Example.java. */ class Example { // Выполнение всякой программы на Java начинается // с вызова метода main(). public static void main(String args[]) { System.out.println("Java drives the Web."); } }
Итак, выполните следующие действия.
Введите исходный код программы.
Скомпилируйте программу.
Запустите программу на выполнение. Ввод исходного кода программ
Исходные коды примеров программ, представленных в этой книге, доступны на веб-сайте издательства McGraw-Hill по адресу www.oraclepressbooks.com. Перейдите по указанному адресу на главную страницу этого веб-сайта, а затем по ссылке Dowloads-Code-Java A Beginner's Guide, Fifth Edition и далее следуйте инструкциям по загрузке архивного файла с исходными кодами программ. Но исходный код можно ввести и вручную, воспользовавшись простым текстовым редактором, а не текстовым процессором вроде Word, поскольку вместе с исходным текстом программы он записывает в файл сведения о форматировании текста, которые будут восприняты компилятором как недопустимые языковые конструкции. Если вы работаете на платформе Windows, вам вполне подойдет WordPad или другой простой редактор текста.
В большинстве языков программирования допускается присваивать произвольное имя файлу, содержащему исходный код программы. Но в Java действуют иные правила. Для программирования на Java следует знать, что имя исходного файла имеет очень большое значение. В рассматриваемом здесь примере файлу, содержащему исходный код программы, нужно присвоить имя Example .java. Ниже поясняются причины, по которым выбирается именно такое имя файла.
В Java исходный файл формально называется единицей компиляции. Это текстовый файл, содержащий определения одного или нескольких классов. (Исходные файлы первых примеров программ будут содержат только один класс.) Компилятор Java требует, чтобы исходный файл имел расширение . j ava. Анализируя исходный код первого примера программы, вы заметите, что класс имеет имя Example. И это не случайно. В программах на Java весь код должен находиться внутри класса. Условно принято, что имя класса должно совпадать с именем файла, содержащего исходный текст программы. Нетрудно убедиться, что имя файла в точности соответствует имени класса вплоть до регистра. Дело в том, что в Java имена и другие идентификаторы зависят от регистра символов. На первый взгляд, условие соответствия имен классов и файлов может показаться слишком строгим, но оно упрощает организацию и сопровождение программ, как станет ясно из последующих примеров. Компиляция программы
Для компиляции программы Example запустите компилятор javac, указав в командной строке имя исходного файла, как показано ниже. C:>javac Example.java
Компилятор javac создаст файл Example .class, содержащий байт-код программы. Напомним, что байт-код не является исполняемым, но интерпретируется виртуальной машиной Java. Таким образом, результат компиляции в javac нельзя запускать на выполнение непосредственно.
Для запуска скомпилированной программы следует воспользоваться интерпретатором java. В качестве параметра ему нужно передать имя класса Example в командной строке: C:>java Example
В результате выполнения программы на экран будет выведена следующая строка: Java drives the Web.
При компиляции исходного кода Java каждый класс помещается в отдельный выходной файл, называемый по имени класса и получающий расширение .class. Именно по этой причине и выдвигается требование, чтобы имя исходного файла программы на Java в точности соответствовало имени содержащегося в нем класса, а по существу, – имени файла с расширением .class. При вызове интерпретатора Java ему передается имя класса, предназначенного для выполнения (пример такого вызова приведен выше). В результате интерпретатор автоматически находит файл с указанным именем и расширением . class. Обнаружив этот файл, интерпретатор выполняет код, указанный в классе.
На заметку Если при попытке скомпилировать программу компилятор javac не будет найден, вам придется указать полный путь к инструментальным средствам JDK, доступным из командной строки, при условии, что комплект JDK установлен правильно. В Windows это, например, означает, что вам нужно ввести путь к доступным из командной строки инструментальным средствам JDK в переменной окружения PATH. Так, если комплект JDK 7 установлен в выбираемых по умолчанию каталогах, путь к его инструментальным средствам будет следующим: C:Program FilesJavaj dkl. 7 . 0bin. (Разумеется, в этом пути может быть указана другая версия JDK.) Чтобы узнать, как задавать путь к файлам, обращайтесь к справочной системе конкретной операционной системы, поскольку в разных операционных системах эта процедура может отличаться. Но если вам не терпится скомпилировать и выполнить свою первую программу на Java, то укажите полный путь к соответствующим инструментальным средствам прямо в командной строке, как показано в приведенном ниже примере. C:"Program Files"Javajdkl.7.0binjavac Example.java
или C:"Program Files11 Java jdkl. 7 . 0bin java Example
Впрочем, такой способ не совсем практичен. Намного удобнее задать путь к нужным файлам раз и навсегда. Построчный анализ исходного кода первого примера программы
Несмотря на то что программа Example. j ava очень проста и объем ее кода невелик, она обладает рядом свойств, общих для всех программ на Java. Проанализируем эту программу по частям.
Ее исходный код начинается следующими строками: /* Это пример простой программы на Java. Присвоить ее исходному файлу имя Example.java. */
Это комментарии. Как и в большинстве других языков программирования, в Java разрешается комментировать исходный текст программы. Комментарии игнорируются компилятором. Текст комментариев описывает действия, выполняемые программой, а в итоге исходный код становится более простым для восприятия. В данном случае комментарии сообщают, что программа проста, а ее исходному файлу следует присвоить имя Example. java. Очевидно, что в реальных приложениях комментарии описывают, какие именно функции выполняют отдельные фрагменты программы или зачем используются те или иные языковые конструкции.
В Java поддерживаются три вида комментариев. Первый из них приведен в начале рассматриваемой здесь программы и позволяет задавать многострочные комментарии.
Они начинаются символами / и оканчиваются символами /. Любое содержимое, находящееся между этими ограничителями, игнорируется компилятором.
Далее следует приведенная ниже строка кода, class Example {
В ней присутствует ключевое слово class, с помощью которого определяется новый класс. Как упоминалось ранее, класс является основной языковой конструкцией Java, поддерживающей инкапсуляцию. A Example – это имя класса. Определение класса начинается открывающей фигурной скобкой ({) и заканчивается закрывающей фигурной скобкой (}). Элементы, находящиеся между ними, являются членами класса.
Не пытайтесь пока что разобраться в особенностях классов, но имейте лишь в виду, что любой код, какие бы действия он ни выполнял, находится внутри класса. Такая организация свидетельствует о том, что любая программа на Java является в той или иной мере объектно-ориентированной.
Следующая строка кода содержит однострочные комментарии, как показано ниже. // Выполнение каждой программы на Java начинается //с вызова метода main().
Это второй вид комментариев, поддерживаемых в Java. Однострочные комментарии начинаются с символов // и продолжаются до конца строки. Как правило, многострочные комментарии служат для длинных примечаний, а однострочные – для коротких заметок.
Следующая анализируемая строка кода выглядит так, как показано ниже. public static void main (String args[]) {
В этой строке определяется метод main (). Как упоминалось ранее, в терминологии Java подпрограммы принято называть методами. Именно с данной строки начинается работа программы, и приведенные выше комментарии подтверждают это. Выполнение любой прикладной программы на Java начинается с вызова метода main (). Мы не будем пока что касаться назначения каждого элемента анализируемой строки кода. Ведь для этого нужно сначала рассмотреть ряд других языковых средств Java. Но поскольку многие примеры программ, представленные в этой книге, содержат строку с подобным определением метода main (), рассмотрим вкратце ее составные части.
Ключевое слово public называется модификатором доступа. Модификатор доступа определяет правила обращения к членам класса из других частей программы. Если член класса предваряется ключевым словом public, то к нему можно обращаться за пределами класса. (В отличие от public, модификатор доступа private запрещает доступ к членам класса за его пределами.) В данном случае метод main () должен быть объявлен как public, поскольку при выполнении программы он вызывается за пределами своего класса. Ключевое слово static допускает вызов метода main () до создания объекта класса. Указывать его необходимо, поскольку метод main () вызывается виртуальной машиной еще до того, как будут созданы какие-либо объекты. Ключевое слово void лишь сообщает компилятору о том, что метод main () не возвращает значение. Как будет показано далее, для некоторых методов предусматривается возвращаемое значение. Если вам пока еще не все понятно в анализируемой строке кода, не отчаивайтесь. Упомянутые здесь языковые средства Java будут подробно рассмотрены в последующих главах книги.
Как упоминалось выше, метод main () вызывается в начале выполнения программы на Java. Любые данные, которые требуется передать этому методу, задаются с помощью переменных, указываемых в круглых скобках после имени метода. Эти переменные называются параметрами. Если для какого-нибудь метода параметры не предусмотрены, то после его имени указывается лишь пара круглых скобок. В данном случае для метода main () под именем args задается единственный параметр String args [ ]. Это массив объектов типа String. (Массивы представляют собой наборы однотипных объектов.) В объектах типа String хранятся последовательности символов. В данном случае в массиве args методу main () передаются в виде аргументов параметры, указываемые в командной строке при запуске программы. В анализируемой здесь программе данные, получаемые из командной строки, не используются, но в других примерах программ будет показано, каким образом эти данные обрабатываются.
И завершается анализируемая строка кода символом {. Этот символ обозначает начало тела метода main (). Весь код, содержащийся в методе, располагается между открывающей и закрывающей фигурными скобками.
Очередная анализируемая строка кода приведена ниже. Обратите внимание на то, что она содержится в методе main (). System.out.println("Java drives the Web.");
В этой строке кода на экран сначала выводится символьная строка "Java drives the Web. " (Java приводит в действие веб), а затем происходит переход на новую строку. Вывод на экран осуществляется встроенным методом println (). В данном случае метод println () выводит на экран переданную ему символьную строку. Как будет показано далее, с помощью метода println () можно выводить на экран не только символьные строки, но и данные других типов. Анализируемая строка кода начинается с имен System.out. В настоящий момент объяснить их назначение нелегко, поэтому достаточно будет сказать, что System – это предопределенный класс, предоставляющий доступ к системным ресурсам, a out – поток вывода на консоль. Таким образом, System, out – это объек^ инкапсулирующий вывод на консоль. Тот факт, что для определения консоли в Java используется объект, лишний раз свидетельствует об объектно-ориентированном характере этого языка.
Как вы, вероятно, уже догадались, в реальных программах и апплетах Java вывод на консоль (как, впрочем, и ввод с консоли) используется очень редко. Современные вычислительные среды, как правило, носят оконный и графический характер, и поэтому обмен данными с консолью применяется лишь в простых служебных и демонстрационных программах. Далее в этой книге будут рассмотрены другие способы формирования выходных данных средствами Java, а до тех пор ограничимся использованием методов ввода-вывода на консоль в представленных примерах программ.
Обратите внимание на то, что оператор, содержащий вызов метода println (), оканчивается точкой с запятой. Этим символом завершаются все операторы в Java. В других строках кода точка с запятой отсутствует лишь потому, что они формально не являются операторами.
Первая закрывающая фигурная скобка завершает метод main (), а вторая такая же скобка указывает на окончание определения класса Example.
И последнее замечание: в Java учитывается регистр символов. Забвение этого правила влечет за собой серьезные осложнения. Так, если вместо main вы случайно наберете Main, а вместо println – PrintLn, исходный код программы окажется некорректным. И хотя компилятор Java скомпилирует классы, не содержащие метод main (), у него не окажется средств для их выполнения. Следовательно, если вы допустите ошибку в имени main, компилятор скомпилирует программу и не сообщит об ошибке. Но о ней вас уведомит интерпретатор, когда не сумеет обнаружить метод main (). Обработка синтаксических ошибок
Введите текст рассмотренной выше программы, скомпилируйте и запустите ее (если вы не сделали этого раньше). Если у вас имеется некоторый опыт программирования, то вам, безусловно, известно, что никто не гарантирован от ошибок при наборе исходного кода программы, а также о том, насколько просто допустить такие ошибки. Если вы наберете исходный код программы неправильно, компилятор, пытаясь обработать этот код, выведет сообщение об ошибке. Компилятор Java следует формальным правилам, и поэтому строка в исходном коде, на которую он указывает, не всегда соответствует истинному местоположению источника ошибки. Допустим, в рассмотренной ранее программе вы забыли ввести открывающую фигурную скобку после метода main (). В таком случае компилятор сообщит вам о следующих ошибках: Example.java:8: expected public static void ma'in (String args [ ]) Example.java:11: class, interface, or enum expected } ^
Очевидно, что первое сообщение не соответствует действительности: пропущена не точка с запятой, а фигурная скобка.
Таким образом, если ваша программа содержит синтаксические ошибки, не стоит без думно следовать рекомендациям компилятора. Сообщение об ошибке составляется по формальным правилам. Вам же нужно разобраться, каковы истинные причины ошибки. Желательно проанализировать строки кода программы, предшествующие строке, обозначенной компилятором. Иногда ошибку удается распознать лишь после анализа нескольких строк кода, следующих за той, в которой она была на самом деле обнаружена. Еще одна простая программа