Уровень необходимых знаний для понимания статьи: новичок. Вы в процессе изучения квеста Java Syntax, причём ближе к его начальным уровням.
Вы только начали изучать Java. Вас засыпает терминами, как из рога изобилия. Вы грузнете в тоннах технической информации, и, порой путаетесь в трёх соснах. Поверьте, раз вы уже ввязались в программирование, ТАК БУДЕТ ВСЕГДА (в этот момент зловещий смех звучит за кадром, а тихий голос, оборванный на полуслове, шепчет «Беги…спасайся, пока не поздно…»). Ошибки будут преследовать вас до конца программистской жизни, даже если вы — самый лучший разработчик. Однако это вовсе не так страшно, как звучит.
Если вы только приступили к обучению на JavaRush, то, скорее всего, уже сталкивались с затронутыми в статье проблемами. В любом случае, мы были бы рады комментариям с описаниями проблем, которые возникали у вас в первые месяцы изучения Java.
|
Проблема нулевого уровня: путаница с оператором сравнения (==) и оператором присвоения (=).
Это очень частая проблема тех, кто переходит с других языков программирования. Да и вообще, мы с младших классов привыкли, что
(=)
— это знак равенства. Простой трюк, который можно использовать для запоминания, таков: если вы знаете, что вас интересует только одно из значений (вы назначаете одно другому), вы используете одиночный знак «
=
», иначе, если вы заботитесь обо всех переменных и значениях (вы их сравниваете) вам нужен двойной знак «
==
».
Проблема: использование оператора сравнения (==) для проверки эквивалентности строк
Что делать: помните,
никакие объекты Java нельзя проверять на эквивалентность с помощью (==)
, поскольку этот оператор предназначен для проверки равенства примитивных типов.
Для объектов нужно использовать метод
.equals()
. А
String
в языке Java — не что иное, как объект (причём
immutable
).
Объект, помеченный как Immutable — такой объект, состояние которого после создания невозможно изменить. В Java это означает, что все поля экземпляра у класса отмечены как final и являются примитивами (или также immutable ).
|
Проблема: конкатенация строк в цикле
Не пытайтесь повторить это самостоятельно! При каждой конкатенации строк создается новый объект
String
(как мы выяснили выше, строки
immutable
, то есть — неизменяемы). В какой-то момент вы столкнётесь с нехваткой памяти или программа начнёт требовать слишком много времени для выполнения.
Решение. Используйте
StringBuilder
вместо
String
при конкатенации содержимого в цикле. Класс
StringBuilder
используется в том случае, когда нужно сделать много изменений в строке символов. И такие строки, в отличие
String
, не являются
immutable
.
Проблема: NullPointerException
Этот вид исключений возникает, когда мы пытаемся использовать пустой указатель
null
, в то время как на самом деле нам нужен реальный объект.
У всех примитивных типов есть значения по умолчанию. Так, у int это 0 , а у boolean — false . Значение по умолчанию любых ссылочных типов, то есть, объектов, равно null . Это не объект и не тип, это специальное значение. Которое, по сути, означает «здесь ничего нет».
|
Что делать: если ваш код составлен так, что в какой-то момент ваш объект можт принять значение
null
, вам нужно добавить «проверку на
null
», особенно если вы создаёте объект не самостоятельно. Также запомните, что лучше возвращать пустые коллекции, чем набор
null
’ов. Также было бы неплохо добавить валидацию для геттеров и сеттеров.
Проблема: почему-то не работает цикл if / while / for
if (something.equals («что-то еще»)); {// <---- корень зла!!!
System.out.println («Почему я не работаю???»);
}
Что здесь не так? Всё просто: лишняя точка с запятой, она попортила кровь сотням тысяч начинающих Java-программистов. Ну не нужна она после
if ()
. С точки зрения языка, такой синтаксис вполне допустим, поэтому компилятор не будет на него ругаться. Но он завершает условный оператор, и код внутри блока
{}
никогда не выполнит условие выше.
Решение: Помните о логике конструкции. Знак «
;
» означает конец некоего блока, а у нас здесь всё только начинается.
Проблема: попытка получить доступ к нестатическим переменным-членам из статических методов (таких, как main)
Решение. Эта проблема связана с пониманием самого понятия
static
. Если метод помечен этим словом, это означает, что нам не нужно создавать экземпляр класса для вызова основного метода. Так что решение — хорошо разобраться со «статиками», понять их сущность.
Проблема: попытка переизобрести колесо, разрабатывая уже существующие библиотеки и инструменты
Решение. На самом деле это не такая уж и проблема. Для новичка это больше похоже на полезное упражнение. Тем не менее, если вы хотите сосредоточиться на результате, например, создать удобную базу данных абонентов, то поиск абонента в телефонной книге для вас — всего лишь один из результатов работы вашего приложения. В таком случае не стоит писать алгоритм бинарного поиска. Воспользуйтесь уже существующим (уверяем, кто-то уже написал его до вас и в стандартных библиотеках он есть). Так что изучайте стандартные библиотеки Java в документации Oracle. Учитесь гуглить, привыкайте читать Stack Overflow и задавайте вопросы на
help JavaRush!
…Разумеется, это далеко не все проблемы новичков. Опишите свои в комментариях!
Вам интересно читать статьи, связанные с Java? Вступайте в группу Java Developer.
Тут много интересного.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ