JavaRush /Курсы /Java Syntax Pro /Популярные ошибки начинающих программистов

Популярные ошибки начинающих программистов

Java Syntax Pro
12 уровень , 6 лекция
Открыта

1. Сравнение объектов с помощью ==

Любимая ошибка программистов-новичков — сравнение объектов (особенно строк) с помощью оператора == Пример:

Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
   System.out.println("Строки равны");
}

Такой код никогда не выведет надпись «строки равны», т.к. в if-е происходит сравнение ссылок на два разных объекта строк.

Правильный вариант кода такой:

Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1.equals(s2))
{
   System.out.println("Строки равны");
}

12
Задача
Java Syntax Pro, 12 уровень, 6 лекция
Недоступна
Яблоки бывают разные
Исправь ошибку в коде, чтобы программа вывела на экран фразу: "телефоны одинаковые".

2. Изменение объекта String

Часто программисты-новички забывают, что все объекты класса являются неизменяемыми (immutable), и все методы класса String возвращают новый объект, а текущий объект никогда не меняется.

Пример:

String s = "Привет";
s.toUpperCase(); // преобразование строки к верхнему регистру

Такой код очень похож на правильный, но работать не будет. Метод toUpperCase() не меняет объект, у которого был вызван. Правильный код будет выглядеть так:

String s = "Привет";
String result = s.toUpperCase(); // преобразование строки к верхнему регистру

12
Задача
Java Syntax Pro, 12 уровень, 6 лекция
Недоступна
Все буквы маленькие
Программа должна считать с консоли строку и вывести ее на экран в нижнем регистре. Исправь ошибку в коде, чтобы программа работала корректно.

3. Забыли проинициализировать объекты, являющиеся элементами массива

Еще одна частая ошибка — забыли инициализировать переменную-массив. Пример:

int[] array;
array[0] = 1;
array[0] = 2;

Такой код работать не будет: в переменную array нужно явно присвоить ссылку на объект-контейнер, который будет хранить элементы массива.

int[] array = new int[10];
array[0] = 1;
array[0] = 2;

12
Задача
Java Syntax Pro, 12 уровень, 6 лекция
Недоступна
Забытая инициализация
В программе массив заполняется числами от 0 до 9 и выводится на экран. Но из-за ошибки программа не компилируется. Сделай так, чтобы программа компилировалась и работала правильно.

4. Подмена поля класса локальной переменной.

Новички не любят придумывать длинные и осмысленные названия переменным. Часто у них переменные имеют имена a, b, i и т.д. Это может сыграть злую шутку, когда таких переменных в коде несколько:

Занести в 100 ячеек массива число 99
class Solution
{
  public static int a = 99;
  public static int i = 100;

  public static void main(String[] args)
  {
    int[] a = new int[i];
    for (int i = 0; i < 10; i++)
    {
      a[i] = a;
    }
  }
}

Код выше не скомпилируется. Исправленный вариант будет выглядеть так:

Занести в 100 ячеек массива число 99
class Solution
{
   public static int value = 99;
   public static int count = 100;

   public static void main(String[] args)
   {
      int[] a = new int[count];
      for (int i = 0; i < count; i++)
      {
         a[i] = value;
      }
   }
}

12
Задача
Java Syntax Pro, 12 уровень, 6 лекция
Недоступна
Затенение поля класса
В методе main вызывается метод add, который должен увеличить значение поля salary класса Solution на переданное значение, но при выводе поля salary получаем 0. Сделай так, чтобы программа работала правильно.

5. Удаление элемента коллекции

Очень часто бывают ситуации, когда из коллекции нужно удалить определенный элемент. Выглядит этот код примерно так:

ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

for (Integer value: list)
   if (value < 0)
      list.remove(value);

Такой код работать не будет, т.к. нельзя одновременно обходить элементы коллекции с помощью цикла for-each и изменять ту же самую коллекцию.

Есть несколько решений. Во-первых, можно идти по одной коллекции, а менять другую:

Решение 1
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

ArrayList<Integer> copy = new ArrayList<Integer>(list);
for (Integer value: copy)
   if (value < 0)
      list.remove(value);

Во-вторых, у коллекции, начиная с Java 8, появился метод removeIf(), в который можно передать правило (лямбда-функцию), указывающее, какие элементы нужно удалить.

Пример:

Решение 2
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

list.removeIf( x-> x<0 );

12
Задача
Java Syntax Pro, 12 уровень, 6 лекция
Недоступна
Почувствуй себя деканом
У нас есть группа в университете и метод, который должен отчислять конкретного студента, но он почему-то не работает. Твоя задача — найти ошибку и исправить, чтобы метод exclude смог отчислить студента.

6. Помещение в один файл сразу нескольких классов с модификатором public

В одном файле может быть только один публичный класс. В файле могут быть объявлены еще классы, но они должны быть или внутренними классами публичного класса, или же не иметь модификатора public. Пример:

Содержимое файла Solution.java Примечание
public class Solution
{
}
public class Main
{
}
Так нельзя: два публичных класса в одном файле.
public class Solution
{
}
class Main
{
}
А так можно. Класс Main — не публичный
public class Solution
{
  public static class Main
  {
  }
}
И так можно. Класс Main — вложенный класс

12
Задача
Java Syntax Pro, 12 уровень, 6 лекция
Недоступна
MacCoffee 3 в 1
У нас есть набор классов, чтобы сделать кофе три в одном, но почему-то кофе не заваривается — задача не компилируется. Найди и исправь одну ошибку в коде.

7. Вызов обычных методов класса из статического метода main()

Иногда программисты-новички обращаются к нестатическим переменным и методам из метода main() или других статических методов. Такой код, конечно, не будет работать.

public class Solution
{
   public int n = 100;
   public int[] createArray()
   {
      return new int[n];
   }

   public static void main(String[]args)
   {
      int[] array = createArray();
   }
}

Метод main может обратиться только к статическому методу/переменной. Ну или сначала создать объект класса Solution, и только потом вызвать нестатические методы у этого объекта. Пример:

Решение 1 Решение 2
public class Solution
{
  public static int n = 100;

  public static int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    int[] array = createArray();
  }
}
public class Solution
{
  public int n = 100;

  public int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    Solution sol = new Solution();
    int[] array = sol.createArray();
  }
}

12
Задача
Java Syntax Pro, 12 уровень, 6 лекция
Недоступна
Составляем список студентов
Метод main должен добавлять двух студентов в массив и выводить их в консоль с помощью метода printStudents. Сделай исправления в методе main, чтобы программа заработала.

8. Объявление конструктора как метода

Еще одна частая ошибка — неверное объявление конструктора класса. Имя конструктора должно совпадать с именем класса, и типа-результата у конструктора нет. Самые частые ошибки выглядят так:

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}




Тип результата тут не нужен
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}




Неверное имя конструктора. Имя конструктора должно совпадать с именем класса
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}






Пропущен this — переменная value будет присвоена сама себе
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}




Все правильно

12
Задача
Java Syntax Pro, 12 уровень, 6 лекция
Недоступна
Студент
Метод main класса Solution создает объект класса Student с конкретным именем, но программа не компилируется. Тебе нужно исправить ошибку в классе Student, чтобы программа компилировалась, и при запуске в консоль выводилось имя студента.

9. Неверное наследование интерфейсов

Разработчики Java старались сделать его очень близким к английскому языку, поэтому для некоторых родственных понятий они выбрали разные ключевые слова.

Когда класс наследуется от класса, нужно использовать ключевое слово extends:

class Pet
{
}

class Cat extends Pet
{
}

Когда класс наследуется от интерфейса, нужно использовать ключевое слово implements:

interface Meow
{
}

class Cat implements Meow
{
}

Когда интерфейс наследуется от интерфейса, нужно использовать ключевое слово extends:

interface Meow
{
}

interface Voice extends Meow
{
}

12
Задача
Java Syntax Pro, 12 уровень, 6 лекция
Недоступна
Телефон в наследство
Необходимо правильно расставить ключевые слова extends и implements в представленных классах, чтобы программа компилировалась.

10. Пропуск слова break в операторе switch

И последняя у нас, но не последняя для новичков ошибка, — это пропуск оператора break в операторе множественного выбора switch. Пример

Неправильно Правильно
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Понедельник");
   case TUESDAY:
      System.out.println("Вторник");
   case WEDNESDAY:
      System.out.println("Среда");
   case THURSDAY:
      System.out.println("Четверг");
   case FRIDAY:
      System.out.println("Пятница");
   case SATURDAY:
      System.out.println("Суббота");
   case SUNDAY:
      System.out.println("Воскресенье");
}
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Понедельник");
      break;
   case TUESDAY:
      System.out.println("Вторник");
      break;
   case WEDNESDAY:
      System.out.println("Среда");
      break;
   case THURSDAY:
      System.out.println("Четверг");
      break;
   case FRIDAY:
      System.out.println("Пятница");
      break;
   case SATURDAY:
      System.out.println("Суббота");
      break;
   case SUNDAY:
      System.out.println("Воскресенье");
      break;
}

12
Задача
Java Syntax Pro, 12 уровень, 6 лекция
Недоступна
Текстовые цифры
Программа преобразует цифры в текст. В классе Solution есть статический метод digitToText(char), который возвращает текстовое представление цифр. В методе main число переводится в текстовое представление, но выводится только "девять девять ... ". Добавь в метод digitToText(char) нужное количество опе

Комментарии (372)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Виктор Уровень 14
20 мая 2025
Сказали пройтись по одной коллекции, а изменения делать в другой ну ок, так и сделаем.) И пойде́м заполним пробелы в знаниях.
Yasmina Уровень 14
25 января 2025

public void exclude(String excludedStudent) {
        students.remove(excludedStudent);
        }
Артемий Уровень 23
21 января 2025
декана идея так предложила сделать, сопротивляться не стал

public void exclude(String excludedStudent) {
        students.removeIf(excludedStudent::equals);
    }
Максим Уровень 35
6 января 2025
зачем применять итератор. в примере было указанно, что можно пройтись лямда выражением students.removeIf(student-> student.equals(значение переданное в метод)
JaCat Уровень 16
3 января 2025
Честно говоря никогда не задумывался тупо ли авторы локализовали этот курс с английского или пытались тут что-то менять. Но последовательность подачи материала тут явно нарушена. Если только это не какой-то хитрый ход, чтобы мы типа учились искать материалы в других источниках. По коллекциям, задача решается через итератор в методе, откуда нам вообще про это знать.

public void exclude(String excludedStudent) {
        Iterator<String> iterator = students.iterator();
        while (iterator.hasNext()) {
            String student = iterator.next();
            if (student.equals(excludedStudent)) {
                iterator.remove();
            }
        }
    }
Павел К. Уровень 33
1 февраля 2025
потому что она решается без итератора методом, который был указан в лекции
Юрий Болотин Уровень 16
29 марта 2025
Вы просто невнимательно прочитали материал, поэтому подумали, что задача решается только с помощью Iterator. Цитата: "Во-вторых, у коллекции, начиная с Java 8, появился метод removeIf(), в который можно передать правило (лямбда-функцию), указывающее, какие элементы нужно удалить." Хочу отметить, что решение с итератором тоже является корректным.
Yasin Akhmadov Уровень 21
31 декабря 2024
Мы не можем вызывать обычные методы и поля класса в static методах, потому что такие методы ожидают того, что в них уже созданы объекты, переменные и методы которых мы используем. Однако появляется вопрос: "Почему они ожидают от нас объекты? Что мне мешает использовать static методы для объектов так же, как и обычные?". И вот ответ. Дело в том, что обычные методы БУКВАЛЬНО привязаны к объектам и всегда имеют скрытый параметр this - ссылку на объект, от которого и объявлен метод. Получается, что методы описывают поведение объектов и служат им. А вот со static методами версия другая. 1) Во-первых static методы не служат и не принадлежат объектам, они привязаны к статическому объекту, который существует всегда. 2) Во-вторых static методы не имеют скрытого параметра this, значит они не ссылаются ни на какой объект. Если мы от объекта вызовем static метод, который использует обычные поля и методы, то объект не поймёт, ЕГО ЛИ переменные и методы используются в этом static методе, ведь в нём нет скрытого параметра this. Тогда какой вывод мы можем сделать об обычных методах и static методах исходя из выше описанных тонкостей? 1) Обычные методы принадлежат и служат объектам таким образом, что они описывают его поведение, используя его переменные и другие методы. А могут они так потому что имеют параметр this - ссылку на объект. Кстати переменные объекта в методах тоже имеют этот параметр. 2) Static методы существуют сами по себе, без объектов. Их можно назвать независимыми. Они не имеют скрытого параметра this, из-за чего объектам неоткуда брать ссылку на свои переменные и методы в этом static методе. Для чего вообще разные методы? Обычные методы - для описания поведения объектов. Статические методы - для достижения какого-либо результата независимо от объектов.
Anonymous #3473304 Уровень 49
18 ноября 2024
задача "Почувствуй себя деканом" сложность Epic должно стоять, так как коллекции изучаются с 30 уровня. P. S. извиняюсь за неточность, на 13 уровне начинается изучение коллекций.
Soup🍲 Уровень 15
25 декабря 2024
ну там скорее задача на поиск ошибок в коде. С лямда выражением можно спокойно решить задачу,подставив свои значение (х-> х.equals(входящая переменная метода)
Anonymous #3473304 Уровень 49
25 декабря 2024
На этом уровне не может человек знать о switch case через лямбда выражениях. Они проходятся в 19-ом уровне (могу ошибаться).
Nikita White Уровень 26
12 января 2025
Да ты наверное шутишь.Я за 10 секунд её решил не вникая.Главное знать что нельзя коллекцию во время итерации сразу менять.Так как у нас в функции 1 аргумент я обошёлся переменно index и положил туда индекс совпавшего кандидата на вылет.А уже после цыкла удалил из колекции вот и всё.И не надо там копию колекции создавать и тому подобное что тут описывали.Я когда решил задачу только потом лекцию прочитал и увидел эту лямбду.Сначала пытайся своим умом решить.Хотя ты знаешь да ,зря они показывают новичкам такие вещи.Мы ведь всё поглотить пытаемся им нужно лучше фильтровать материалл.
Anonymous #3473304 Уровень 49
12 января 2025
на счёт создания переменной и присвоения ей нужной ячейки (массива/списка), когда она нашлась фором или форычем, тут ты прям в яблочко, в Java Core попалась лёгкая задача и я не догадался так сделать, хотя этим нужно пользоваться. Три строчки лучше шести, если всё читабельно 🙂
Hofman Hagl Уровень 26
18 октября 2024
в 4-том пункте лекции. Вместо а -> Main.a и всё компелируеться. public class Solution{ public static int a = 99; public static int i = 100; public static void main(String[] args) { int[] a = new int[i]; for (int i = 0; i < 10; i++) { a[i] = a; } } }
Rustam Уровень 26 Student
28 сентября 2024
Очень много негатива на JR в комментариях. Ресурс классный, есть недостатки, конечно, но уж точно не критичные. Если действительно ничего полезного не получается для себя найти, зачем тогда сидеть здесь. Давайте лучше в комментариях делиться чем-то толковым: статьями, объяснениями задач, фишками по коду и тп.
6aHguTo Уровень 36
14 сентября 2024
Уважаемые разрабы Javarush, добавте плиз в плагин БОЛЬШУЮ и ЯРКУЮ кнопку, СИНХРОНИЗИРОВАТЬ ЗАДАЧИ. Надоело уже каждый раз лазить в профиль)
mikeudin Уровень 26
25 сентября 2024
Полностью поддерживаю, сами задачи не синхронизируются
Di Уровень 16 Expert
26 сентября 2024
точно, а еще лучше, что бы синхронизация происходила автоматически, при каждом запуске среды и было бы славно, если бы она активировалась после решения последней задачи лекции. Накидайте плюсов парню, думаю многие поддержат
Danя Уровень 30
16 октября 2024
чел нажать две кнопки вместо одно, ЭТО ВЕДЬ ТАК ТРУДНО
NikitaMorozka Уровень 38
16 октября 2024
Чел, ты РЕАЛЬНЫЙ кринге
11 января 2025
Вроде если нажать "Save all" перед выходом из плагина, то результат фиксируется