FAQ

 
 
 
Сообщения:61
Что такое Java?
Я хочу изучать Java. С чего мне начать?
Где можно скачать книги и документацию? Какие существуют печатные издания книг?
Скачать и установить JDK?
Какие бывают IDE?
Написать и запустить Hello World?
О classpath
Исключения
Интерфейсы
ClassDefNotFoundException
Final поля
Изменен:01 мар 2007 20:30
 
 
Сообщения:61
1. Что такое Java?
Java является объектно-ориентированным языком программирования: объектно-ориентированнее не бывает :). По сравнению с ним, такие языки программирования как С++, это просто языки, "поддерживающие объекты". В отличие от них в Java нет средств, позволяющих писать необъектно-ориентированные программы.
 
 
Сообщения:61
2. Я хочу изучать Java. С чего мне начать?
Прежде всего запаситесь компилятором и каким-нибудь IDE. Прочитайте пару книжек. А все вопросы, возникающие в процессе изучения вы можете спросить здесь же.
Изменен:01 мар 2007 20:31
 
 
Сообщения:61
3. Где можно скачать книги? Какие существуют печатные издания книг?
Безусловно, лучше API от Sun Microsystems вы не найдете.
Документацию можно скачать здесь.

Б. Эккель Философия Java.
С. Хортсман, Г. Корнелл "Java2 ", 2 тома.
 
 
Сообщения:61
4. Скачать и установить JDK?
Sun Microsystems в разделе Downloads, качаем, запускаем, устанавливаем.
Рассмотрим подробнее что же мы установили:
JRE - Java Runtime Environment. Устанавливается сама JVM(Java Virtual Machine), которая позволяет запускать Java-приложения. Нужна только пользователям, программистам ее мало.
JDK - Java Development Kit. Кроме JVM еще устанавливаются средства для разработки Java-приложений. Программистам без этого пакета никак. JDK можно ставить без JRE, там уже все есть.
Также после установки пакетов, нужно установить Переменные среды в ОС:
  • Windows: заходим в свойства моего компьютера(Win+Break) -> Дополнительно -> Переменные среды.
    В переменную path через точку с запятой выставляем путь к папке JDK/bin.
    Создаем переменную JAVA_HOME и записываем путь к JDK.
Изменен:01 мар 2007 20:28
 
 
Сообщения:61
5. Какие бывают IDE?
NetBeans
Eclipse
IDEA
GeI
JDeveloper
SunOne Studio
IBM Rational Application Developer
 
 
Сообщения:9474
6. О classpath

classpath - это область видимости ваших классов. Для того, чтоб один класс смог видеть другой класс, последний должен быть в classpath'e. Если хотите подключить к проекту библиотеку, она тоже должна быть включена в classpath при компиляции и во время запуска. Вот команда для компиляции простого приложения(допустим, наш главный класс лежит в пакете ru.javatalks.classpath.example.Main):
javac -cp . ru.javatalks.classpath.example.Main.java
Точка указывает на текущий каталог, она необходима дабы все классы из ваших пакетов были включены в classpath.
Если ваши библиотеки, которые необходимы для компиляции и запуска приложения, лежат в каталоге lib, то команда будет выглядеть следующим образом:
javac -cp .;lib/somejar.jar;lib/otherjar.jar ru.javatalks.classpath.example.Main.java
То есть все пути, в которые должен заглянуть компилятор, прописываются через точку с запятой(без каких-либо пробелов). Каждая библиотека должна прописываться отдельно, нельзя просто прописать каталог с jar'ами.
Если вы создаете исполняемый jar-архив вашего приложения, classpath там должен быть прописан в манифесте:
Class-Path: .;lib/somejar.jar;lib/otherjar.jar
Все выше сказанное касается так же запуска приложения с помощью java/javaw.
Изменен:01 авг 2010 07:59
 
 
Сообщения:9474
7. Исключения

Исключение (исключительная ситуация, exception) - это ненормальная ситуация в логике приложения. К примеру, метод считывает страницы с нескольких сайтов. В идеальном мире этот метод работал бы без всяких "но", однако в реальности у пользователя может оборваться соединение, тогда метод не может быть работоспособным. Это исключительная ситуация. Такие ситуации нужно отлавливать и правильно обрабатывать.

Исключения решают следующие проблемы:
1. Неоднозначность возвращаемых значений. К примеру, этот метод добывает число из строки:
Integer.parseInt("fff");
Что мы должны возвращать в данном случае, если не будет никаких исключений? 0? Но, ведь, туда и "0" могли передать, как тогда определить отработала ли функция верно или нет?
2. Информативность. К примеру, метод работает с сетью и может выбрасывать ConnectionRefusedException при разрыве соединения. Если бы он не был помечен как throws ConnectionRefusedException, разработчик может и не подумать о том, что такая ситуация может произойти, а произойти она может через месяц, когда программу показывают заказчику :)
3. Неработоспособность объекта. К примеру, есть объект, который из БД выбирает Пользователей. Его используют другие объекты. При инициализации ему подсунули неправильный URL к базе. Этот объект не может выполнять свои функции. Что прикажете с ним делать? Он должен выбросить исключение, ибо он битый.
4. ШопНеЗабытьИсключение. Часто бывает необходимость реализовать метод какого-либо интерфейса, который, собственно, пока не особо нужен и тратить на него время не хочется. Однако возможно кто-то другой захочет этот метод вызвать. Чтоб не вышло ситуации, когда разработчик по несколько часов сидит перед монитором, не понимая, почему метод возвращает неправильные значения или не изменяет состояние объекта(были реальные случаи!), лучше всего не оставлять тело метода пустым, а выбрасывать UnsupportedOperationException.

Существует два вида исключений:
  • Checked exceptions - это исключения, которые вызовут ошибку компиляции, если не обрамить их с помощью try-catch.
  • Unchecked exceptions - те исключения, которые не обязательно отлавливать. Эти исключения должны быть описаны в комментариях, иначе как пользователь ваших классов узнает о его существовании? Эти исключения позволяют сократить количество строк кода и улучшить его читабельность, однако применять его где нипопадя нельзя. Есть несколько случаев, когда следует использовать этот вид исключений:
    • Когда исключение может возникнуть по халатности разработчика. К примеру, IndexOutOfBoundException возникнет в случае, если программист неправильно оформит цикл, NullPointerException - если обратиться к null-ссылке.
    • В последнее время пошла мода выбрасывать RuntimeException в случае возникновения критических ошибок в приложении. К примеру, если в файлах свойств была прописан неверный user-password к БД, то приложение не сможет продолжать работать. Обработать правильно такое исключение в большинстве случаев не представляется возможным, посему может быть уместным использовать именно эти исключения.
  • Подробней о том, какие исключения когда лучше использовать можно прочитать в статье Barry Ruzek'а


Синтаксис отлавливания исключений может включать блок finally:
try {
   someObject.someMethod();
} catch(SomeException e) {
   logger.warning("Some exception occured", e);
} finally {
   //some finalizations
}
Блок finally будет выполняться независимо от того выбросилось ли исключение или нет. Служит он для того, чтоб, к примеру, закрыть соединение к файлу. Ведь, соединение должно закрыться в любом случае - произошло ли чтение из него с ошибками или без, в противном случае придем к утечки памяти из-за незакрытых ресурсов.
Описание типичный исключений в Java можно найти здесь.
Изменен:23 ноя 2010 20:59
 
 
Сообщения:9474
Интерфейсы

Упрощенно можно сказать, что интерфейс - это абстрактный класс без единого реализованного метода. Вообще интерфейсы трудно назвать классом - они просто предоставляют описание того, как работать с механизмом (классом). Технические отличия между интерфейсом и абстрактным классом:
- все методы public abstract
- интерфейсы не могут содержать реализованных методов
- все константы public static final
- допустимо множественное наследование

Не нужно искать каких-то идеологических отличий интерфейса от абстрактного класса, по сути абстрактный класс без реализации можно назвать интерфейсом, т.к. он тоже будет служить описанием и не более.
Исключение: в отличае от абстрактного класса, интерфейс может применяться как маркер, например, Cloneable, Serializable.

Если до сих пор не понятно что такое интерфейс, вот шаги, которые вам нужно предпринять (спасибо bomba_flanker за их составление):
1) Сначала изучите наследование, поймите что это такое, обратите внимание на переопределение методов
2) Изучите понятие абстрактный класс, абстрактный метод, для чего необходимо объявлять абстрактные классы.
3) Если Вы поняли, с чем кушают абстрактный класс, то можете считать, что Вы поняли и интерфейсы, т.к. это практически одно и то же, за исключением некоторых "но" (например, интерфейсы позволяют осуществлять множественное наследование), но это уже другая история.
Изменен:16 мар 2011 19:31
 
 
Сообщения:9474
ClassDefNotFoundException

Каждый когда-либо сталкивается с этой ошибкой - означает она, что какой-то класс не находится в classpath, но где-то в приложении он используется. Выскакивает по следующим причинам:
  • Не добавлена внешняя библиотека в classpath. Пути решения:
    • библиотека может у вас лежать в каталоге, но вы ее не подключили - убедитесь, что вы проверили этот пункт
    • вбить ошибку в гугл, у кого-то она уже скорей всего была
    • пакеты как правило именуют логически здравые люди, и по их названию часто можно определить что за библиотека нужна
  • библиотека добавлена, но версия не совпадает с той, которую используют классы других библиотек, соответственно и ошибка может отличаться, например, в ней может говориться, что в классе нет какого-то метода(NoSuchMethodException). Пути решения:
    • конечно же гуглить!
    • если вдруг не нагуглили (в чем я сомневаюсь), пробуйте разные версии библиотеки и отписывайтесь на форуме ;)

  • вы запустили java SomeClass, и какой-то класс не находится. Это значит вы не прочитали ничего по Java, советую начать с какой-нибудь книги для начинающих. Конкретно для этой проблемы решение здесь
  • В классе есть статический блок инициализации, в этом блоке выскочило исключение, тогда class loader не загрузит класс, в таком случае при обращении к классу будет выброшено ClassDefNotFoundException
 
 
Сообщения:9474
Final поля

Главное свойство final полей - им можно присвоить значение лишь раз, и оно присваивается при создании объекта. Зачем поля помечают как final:
  • Это позволяет объект сделать immutable, - то бишь тот, что не изменяет своего состояния никогда после создания. Такие классы как Integer, Double - они immutable к примеру. Старайтесь делать классы immutable всегда, когда это возможно.
  • Это упрощает чтение класса. Допустим, если у вас есть 10 полей и 5 из них никогда не изменяются, намного же проще об этом узнать пометив поле как final, вместо того, чтоб искать есть ли set-методы или другие какие методы, которые изменяют это поле. Здесь интересно описан лозунг final полей касающийся даного пункта, final будто говорит читателю: "Если ты в поисках сложностей, здесь ты их не найдешь".
  • Это увеличивает производительность. Компиляторы делают некоторые минорные оптимизации, если видят, что поле final. Это больше относится к классам, объекты которых часто создаются, для классов-синглтонов например это не даст значимого улучшения производительности.
  • Способствует потоко-безопасности. Этот пункт нужно немного пояснить. Допустим у вас есть класс Книга, в которой есть не final поля. Допустим мы создаем объект, передаем аргументы в конструктор и сразу же передаем его другому потоку. Так вот, если поля не final, первый поток может не успеть опубликовать изменения из своего кеша в основную память, где все потоки видят актуальное состояние переменных. Но с final полями такой проблемы нет, Java Memory Model гласит, что если поле помечено как final, JVM реализации обязаны его вернуть полностью сконструированным. Т.е. final слово - один из способов осуществить safe publication объекта[2]

Как все-таки можно изменить final поле? Только через Отражение обращаясь к нему напрямую через класс Field.
В заключение: всегда помечайте поля как final, когда это возможно. Точно так же, как вы помечаете поля private пока нет необходимости в обратном, так же по отношению к полям используйте и ключевое слово final.

Список литературы:
[1] Joshua Bloch "Effective Java"
[2] Brian Goetz "Java Concurrency in Practice"
[3] Java Memory Model
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет