JavaRush /Java блог /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. Тут много интересного.
Комментарии (23)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
AlekseiSieger Уровень 29
29 октября 2022
У меня проблема в том, что я каждый раз сижу и не понимаю вообще, с чего начать. Я как не понимал, как тут что-либо работает, так и продолжаю не понимать на 11 уровне. Могу только скопировать чужой код и адаптировать его под себя, на этом мои полномочия все. Даже не знаю, что с этим поделать.
Pifagor Olympiads Уровень 2
8 апреля 2022
public static void main(String[] args) { String a = "Hello"; String b = "Hello"; System.out.println(a == b); //true } Почему это так? Или в новых версиях доработали так, что он сравнивает строки без .equal()?
Begemoth Уровень 24
5 ноября 2020
Почему пишут, что "У всех примитивных типов есть значения по умолчанию. Так, у int это 0.", но следующий код не компилируется:

    public static void main(String[] args) {
        int i;
        System.out.println(i); //java: variable i might not have been initialized
    }
Юрій Якимчук Уровень 33
30 сентября 2019
Проблема одна - лень
Андрей Уровень 25
14 февраля 2019
"Простой трюк, который можно использовать для запоминания, таков: если вы знаете, что вас интересует только одно из значений (вы назначаете одно другому), вы используете одиночный знак «=», иначе, если вы заботитесь обо всех переменных и значениях (вы их сравниваете) вам нужен двойной знак «==»." Понять этот трюк сложнее, чем разницу между операторами.
Игорёк Потылёк Уровень 22
20 января 2019
Чем дальше идёшь, тем смешнее со временем кажутся эти ошибки.
gangmaster Уровень 19
20 января 2019
Глаза боятся, а руки кодят :))
AlexeyV Уровень 19
26 августа 2018
Не понимаю, как можно спутать = и ==, если тебе вдолбили на лекции что = это присваивание а == это равно? В детском саду дети запомнят, не то что школьники или студенты. А настоящая проблема, это если не можешь понять принцип, что и когда надо вызвать, как это сделать, через чего и каким местом. Вот я пока на данной стадии. Иной раз читаешь задачу, пишешь - уперся в стену. Через сутки ломания мозгов и поисков информации в интернете, смотришь решение, и понимаешь, что нихрена не понимаешь.
Незнайка Уровень 40
6 ноября 2017
Самая распространенная проблема это ошибки в текстах лекций. В приведенном примере код внутри блока {} будет выполнятся всегда.
Leo Уровень 1
6 ноября 2017
моя проблема в том что я пока не могу купить подписку тут и учусть в интернте))) первые слодности у меня возникли с вводом в консоль. как то оно неудобно в джаве. но вообще интересно!