JavaRush/Блог/Java Developer/Самые распространённые проблемы тех, кто начинает учить J...

Самые распространённые проблемы тех, кто начинает учить Java

Статья из группы Java Developer
участников
Уровень необходимых знаний для понимания статьи: новичок. Вы в процессе изучения квеста Java Syntax, причём ближе к его начальным уровням. Самые распространённые проблемы тех, кто начинает учить Java - 1Вы только начали изучать Java. Вас засыпает терминами, как из рога изобилия. Вы грузнете в тоннах технической информации, и, порой путаетесь в трёх соснах. Поверьте, раз вы уже ввязались в программирование, ТАК БУДЕТ ВСЕГДА (в этот момент зловещий смех звучит за кадром, а тихий голос, оборванный на полуслове, шепчет «Беги…спасайся, пока не поздно…»). Ошибки будут преследовать вас до конца программистской жизни, даже если вы — самый лучший разработчик. Однако это вовсе не так страшно, как звучит.
Если вы только приступили к обучению на JavaRush, то, скорее всего, уже сталкивались с затронутыми в статье проблемами. В любом случае, мы были бы рады комментариям с описаниями проблем, которые возникали у вас в первые месяцы изучения Java.

Проблема нулевого уровня: путаница с оператором сравнения (==) и оператором присвоения (=).

Это очень частая проблема тех, кто переходит с других языков программирования. Да и вообще, мы с младших классов привыкли, что (=) — это знак равенства. Простой трюк, который можно использовать для запоминания, таков: если вы знаете, что вас интересует только одно из значений (вы назначаете одно другому), вы используете одиночный знак «=», иначе, если вы заботитесь обо всех переменных и значениях (вы их сравниваете) вам нужен двойной знак «==».

Проблема: использование оператора сравнения (==) для проверки эквивалентности строк

Что делать: помните, никакие объекты Java нельзя проверять на эквивалентность с помощью (==), поскольку этот оператор предназначен для проверки равенства примитивных типов.
Самые распространённые проблемы тех, кто начинает учить Java - 2
Для объектов нужно использовать метод .equals(). А String в языке Java — не что иное, как объект (причём immutable).
Объект, помеченный как Immutable — такой объект, состояние которого после создания невозможно изменить. В Java это означает, что все поля экземпляра у класса отмечены как final и являются примитивами (или также immutable).

Проблема: конкатенация строк в цикле

Не пытайтесь повторить это самостоятельно! При каждой конкатенации строк создается новый объект String (как мы выяснили выше, строки immutable, то есть — неизменяемы). В какой-то момент вы столкнётесь с нехваткой памяти или программа начнёт требовать слишком много времени для выполнения. Решение. Используйте StringBuilder вместо String при конкатенации содержимого в цикле. Класс StringBuilder используется в том случае, когда нужно сделать много изменений в строке символов. И такие строки, в отличие String, не являются immutable.

Проблема: NullPointerException

Этот вид исключений возникает, когда мы пытаемся использовать пустой указатель null, в то время как на самом деле нам нужен реальный объект.
У всех примитивных типов есть значения по умолчанию. Так, у int это 0, а у booleanfalse. Значение по умолчанию любых ссылочных типов, то есть, объектов, равно null. Это не объект и не тип, это специальное значение. Которое, по сути, означает «здесь ничего нет».
Самые распространённые проблемы тех, кто начинает учить Java - 3
Что делать: если ваш код составлен так, что в какой-то момент ваш объект можт принять значение null, вам нужно добавить «проверку на null», особенно если вы создаёте объект не самостоятельно. Также запомните, что лучше возвращать пустые коллекции, чем набор null’ов. Также было бы неплохо добавить валидацию для геттеров и сеттеров.

Проблема: почему-то не работает цикл if / while / for

if (something.equals («что-то еще»)); {// <---- корень зла!!!
     System.out.println («Почему я не работаю???»);
}
Что здесь не так? Всё просто: лишняя точка с запятой, она попортила кровь сотням тысяч начинающих Java-программистов. Ну не нужна она после if (). С точки зрения языка, такой синтаксис вполне допустим, поэтому компилятор не будет на него ругаться. Но он завершает условный оператор, и код внутри блока {} никогда не выполнит условие выше.
Самые распространённые проблемы тех, кто начинает учить Java - 4
Решение: Помните о логике конструкции. Знак «;» означает конец некоего блока, а у нас здесь всё только начинается.

Проблема: попытка получить доступ к нестатическим переменным-членам из статических методов (таких, как main)

Решение. Эта проблема связана с пониманием самого понятия static. Если метод помечен этим словом, это означает, что нам не нужно создавать экземпляр класса для вызова основного метода. Так что решение — хорошо разобраться со «статиками», понять их сущность.

Проблема: попытка переизобрести колесо, разрабатывая уже существующие библиотеки и инструменты

Решение. На самом деле это не такая уж и проблема. Для новичка это больше похоже на полезное упражнение. Тем не менее, если вы хотите сосредоточиться на результате, например, создать удобную базу данных абонентов, то поиск абонента в телефонной книге для вас — всего лишь один из результатов работы вашего приложения. В таком случае не стоит писать алгоритм бинарного поиска. Воспользуйтесь уже существующим (уверяем, кто-то уже написал его до вас и в стандартных библиотеках он есть). Так что изучайте стандартные библиотеки Java в документации Oracle. Учитесь гуглить, привыкайте читать Stack Overflow и задавайте вопросы на help JavaRush! …Разумеется, это далеко не все проблемы новичков. Опишите свои в комментариях! Вам интересно читать статьи, связанные с Java? Вступайте в группу Java Developer. Тут много интересного.
Комментарии (24)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
AlekseiSieger
Уровень 29
29 октября 2022, 15:06
У меня проблема в том, что я каждый раз сижу и не понимаю вообще, с чего начать. Я как не понимал, как тут что-либо работает, так и продолжаю не понимать на 11 уровне. Могу только скопировать чужой код и адаптировать его под себя, на этом мои полномочия все. Даже не знаю, что с этим поделать.
Mikhail Lukin
Уровень 9
25 марта, 07:34
Привет. Вижу что у тебя уже 29 уровень! Как сейчас у тебя обстоят дела? а то я вот на 6 уровне и мне как то тяжко дается(
Pifagor Olympiads
Уровень 2
8 апреля 2022, 14:23
public static void main(String[] args) { String a = "Hello"; String b = "Hello"; System.out.println(a == b); //true } Почему это так? Или в новых версиях доработали так, что он сравнивает строки без .equal()?
Maxim Kuzin
Уровень 15
18 сентября 2022, 09:27
Это нюанс, позволяющий оптимизировать память без Вашего участия) Если Java-компилятор в вашем коде (именно в коде) найдет несколько одинаковых строк, для экономии памяти он создаст для них только один объект. String text = "Это очень важное сообщение"; String message = "Это очень важное сообщение"; А в результате и text, и message будут ссылаться на один и тот же объект и, следовательно, иметь одинаковое значение ссылки/адреса. Данный момент описан в 9-й лекции третьего уровня.
Begemoth Software Architect в Сиблион
5 ноября 2020, 10:32
Почему пишут, что "У всех примитивных типов есть значения по умолчанию. Так, у int это 0.", но следующий код не компилируется:
public static void main(String[] args) {
    int i;
    System.out.println(i); //java: variable i might not have been initialized
}
bighugеmistеr Android Developer
14 декабря 2020, 15:08
я могу быть не прав, но я слышал или прочёл где-то, что в текущей версии теперь надо всё инициализировать или что-то в этом роде
Vladislav Kotsko
Уровень 29
30 апреля 2022, 15:09
Значения по умолчанию устанавливаются, когда переменные являются полями класса, а не описаны в методе. В методах переменные должны быть проинициализированны перед обращением к ним.
Юрій Якимчук
Уровень 33
30 сентября 2019, 12:37
Проблема одна - лень
bighugеmistеr Android Developer
14 декабря 2020, 15:07
значит, тебе это не нужно :)
Андрей
Уровень 25
14 февраля 2019, 08:55
"Простой трюк, который можно использовать для запоминания, таков: если вы знаете, что вас интересует только одно из значений (вы назначаете одно другому), вы используете одиночный знак «=», иначе, если вы заботитесь обо всех переменных и значениях (вы их сравниваете) вам нужен двойной знак «==»." Понять этот трюк сложнее, чем разницу между операторами.
Denis Belokopytov
Уровень 5
27 февраля 2019, 15:14
Что сложного?
Игорёк Потылёк
Уровень 22
20 января 2019, 16:58
Чем дальше идёшь, тем смешнее со временем кажутся эти ошибки.
gangmaster
Уровень 19
20 января 2019, 14:47
Глаза боятся, а руки кодят :))
Евгений Нешин
Уровень 13
21 января 2019, 10:39
Глаза боятся, а руки из *опы =)
gangmaster
Уровень 19
21 января 2019, 19:49
Ну это жизненные реалии, от них никуда 8))
AlexeyV
Уровень 1
Expert
26 августа 2018, 08:42
Не понимаю, как можно спутать = и ==, если тебе вдолбили на лекции что = это присваивание а == это равно? В детском саду дети запомнят, не то что школьники или студенты. А настоящая проблема, это если не можешь понять принцип, что и когда надо вызвать, как это сделать, через чего и каким местом. Вот я пока на данной стадии. Иной раз читаешь задачу, пишешь - уперся в стену. Через сутки ломания мозгов и поисков информации в интернете, смотришь решение, и понимаешь, что нихрена не понимаешь.
Denis Belokopytov
Уровень 5
15 февраля 2019, 12:40
Такая же фигня... Нужно больше материала походу читать.
Незнайка
Уровень 40
6 ноября 2017, 14:55
Самая распространенная проблема это ошибки в текстах лекций. В приведенном примере код внутри блока {} будет выполнятся всегда.
Leo
Уровень 1
6 ноября 2017, 10:31
моя проблема в том что я пока не могу купить подписку тут и учусть в интернте))) первые слодности у меня возникли с вводом в консоль. как то оно неудобно в джаве. но вообще интересно!