Рубрики
Без рубрики

Топ-10 + 1 распространенных ошибок, которые совершает каждый изучающий Java

Сказано: “Твой друг проглотит твои ошибки, твой враг преподнесет их на блюдечке”. Я определенно не ваш враг, но я хочу представить вам некоторые ошибки, характерные для каждого начинающего студента Java. Помечено как начинающие, java, кодирование, обучение.

Сказано: “Твой друг проглотит твои ошибки, твой враг преподнесет их на блюдечке”. Я определенно не ваш враг, но я хочу представить вам некоторые ошибки, характерные для каждого начинающего студента Java, и я сделаю это прямо здесь, на этой “табличке” для блогов. Уверен, что есть только некоторые из них, которые я собрал из CodeGym.cc аналитическая система курсов. Если вы еще не знаете, Code Gym – это практический курс Java с нуля до уровня upper intermediate.

Итак, вот они.

0. Присвоение или сравнение ==)?

Это одна из первых ошибок студентов, которые изучают Java с нуля. Легко спутать, что = является оператором присваивания, тогда как == является реляционным оператором. Это естественная ошибка, потому что в математике = = “, чем в Java “=”. Обычно компилятор улавливает такие ошибки, однако они могут быть скрыты от него. Например:

boolean myBoolean; 
If (myBoolean = true) {
doSomething; 
}

Видишь? Этот блок в любом случае будет истинным, потому что вы назначаете его истинным…

1. Сравнение строк с.

Через некоторое время после того, как вы выполнили свои первые задачи на Java (обычно есть некоторые задачи вывода на консоль и арифметические задачи), вы изучаете класс String. Однако новички часто забывают, что конкретная строка не является представителем примитивного типа, такого как char или int, это объект. Вы не можете сравнивать объекты с помощью оператора == . Помните, что для сравнения строк (или других объектов) используйте функцию string.equals(объект объекта) , а не оператор == . Equals проверяет содержимое строки, в то время как оператор == проверяет, равны ли ссылки на объекты.

Честно говоря, строковые константы обычно являются “интернет”. Это означает, что две константы с одинаковым значением действительно можно сравнить с == , но на самом деле не полагайтесь на это. Используйте .равно.

2. Разные имена класса и файла, в котором находится его код.

Эта ошибка была очень популярна (может быть, даже лидером среди всех) несколько лет назад. Сейчас даже новички используют современные идеи, и это находится на грани исчезновения. В любом случае, полезно иметь в виду, что в Java имя файла и имя класса должны быть одинаковыми. Если вы назовете свой файл, например, Test.java и напишите там какой-нибудь код класса, код теста в тренажерном зале:

//File name: Test.java 

public class CodeGymTest { 
   public static void main(String[] args) { 
        System.out.println("Hello world"); 
   } 
}

Вы получите следующий результат:

Test.java:9: error: class CodeGymTest is public, should be
                    declared in a file named CodeGymTest.java
public class CodeGymTest 
^
1 error

Кстати, если вы удалите модификатор public из имени класса, ваша программа будет запущена.

3. Доступ к нестатическим элементам из основного метода или других статических методов

Довольно часто новички не знают, как работать со статическим контекстом. Статическая переменная – это переменная, общая для всех экземпляров класса. Следовательно, существует только одна его копия, которая является общей для всех объектов. Поэтому мы не можем работать с нестатической переменной “статическим способом”. Эта ошибка обычно возникает в методе main() (который является статическим!), когда начинающий программист пытается получить доступ к переменной экземпляра или методу. Если вы попробуете такой код

public class MyExample {
    public String myString;  

public static void main(String[] args) {
        myExample.String = "non static String";    
}
  }

У нас ошибка компиляции:

non-static variable number cannot be referenced from a static context.

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

public class MyExample {
    public String myString;  

public static void main(String[] args) {
MyExample myExample = new MyExample(); 

        myString = "non static String";    
}
  }

Помните, что вы можете работать со статическими переменными или методами из статического или нестатического контекста. Вы можете работать с нестатическими элементами, используя ссылку на объект.

4. Индекс массива находится за пределами массива

Это чрезвычайно популярная ошибка среди начинающих студентов-программистов. Причина такой популярности в том, что самые первые более или менее сложные задачи связаны с массивами и циклами. Очень простой пример:

String[] name = { "Snoopy", "Woodstock", "Charlie Brown" };
for (int i = 0; i <= name.length; i++) {
    System.out.println(name[i]);
}

Цикл начинается с нулевого элемента “Снупи”, затем переходит к первому “Вудстоку” и ко второму “Чарли Брауну” … и пытается напечатать третий элемент, но у нас его нет (наш “третий” – это “второй”, такой как “первый” – номер ноль). Здесь ошибка довольно очевидна, но так бывает не всегда.

Циклы и массивы довольно сложны для новичков. Однако практика делает бриллианты. В Code Gym есть сотни задач “Массивы и циклы”. Попробуйте решить их (пока это бесплатно!), чтобы получить уверенные навыки.

5. Ставим “;” неправильный цикл или условия

В блоке ниже вы не печатаете ни одного из элементов массива. Во-первых, цикл заканчивается на “;”, так что ничего не происходит. Более того: программа не будет работать, потому что ваш int i работает только внутри цикла и заканчивается на “;”.

public static void main(String[] args)  {

            int [] myArray = {2,5,7};
            for (int i=0; i<3; i++);
            {
                System.out.println(myArray[i]);
            }
        }

Если вы попробуете что-то подобное:

public static void main(String[] args)  {

            int [] myArray = {2,5,7};
            int i = 0;

            for (i=0; i<3; i++);
            {
                System.out.println(myArray[i]);
            }
        }

У вас есть java.lang. Исключение ArrayIndexOutOfBoundsException , потому что System.out.println пытается напечатать элемент # 3 и только этот, но у нас нет такого элемента массива. Последний – второй, и он равен 7.

Та же история с ; и условиями. Например:

public static void main(String[] args)  {

            int [] myArray = {2,5,7};
           if (myArray[0] > myArray[1]);
            System.out.println("it is");
        }
    }

Условие здесь не выполняется, но “это” будет напечатано из-за “;” после конструкции if.

Если вы начнете изучать код в тренажерном зале, вы получите свои первые задания по кодированию с циклами на уровне 4 Синтаксис Java поиск. Я думаю, вы забудете о такого рода ошибках, решив достаточно проблем.

6. Отсутствует ключевое слово “break” в конструкции с переключателем

Самое неприятное в отсутствии ключевого слова “break” заключается в том, что ошибок компилятора нет. Однако ваш код работает неправильно.

Посмотрите на пример кода ниже, где мы забыли поставить точку в “случае 0”. Программа будет работать, но она печатает как “0”, так и “1”, потому что конструкция переключателя завершает свою работу с перерывом.

public static void switchCasePrimer() {
        int counting = 0;

        switch (counting) {
            case 0:
                System.out.println("0");
            case 1:
                System.out.println("1");
                break;
            case 2:
                System.out.println("2");
                break;
            default:
                System.out.println("Default");
        }
}

У этого правила есть исключение. Переключатель блок может завершить свою работу с помощью возврата оператора

public class test {
    public static void main(String[] args) {
        System.out.println(showSwitch(1));
    }

    public static int showSwitch(int condition) {
        switch (condition) {
            case 1:
                System.out.println(1);
                return 1;
            case 2:
                System.out.println(2);
                return 4;
            case 3:
                System.out.println(3);
                return 8;
            default:
                System.out.println("default");
                return 256;
        }
    }
}

В этом случае переключатель завершает свою работу сразу после случая 1.

7. Возня с передачей по значению и передачей по ссылке

Если вы передаете методу примитивный тип данных, такой как символ, int или double, вы передаете по значению. Это означает, что копия типа данных будет продублирована и передана вашему методу. Если эти данные изменены внутри метода, они не влияют на “исходные” данные вне метода.

public class Main {

    public static void swap(int i, int j)
    {
        int temp = i;
        i = j;
        j = temp;
        System.out.println("from swap method i = " + i + ", j = " + j);
    }


    public static void main(String[] args) {


        int i1 = 1;
        int j1 = 2;
        swap(i1,j1);
        System.out.println("from main method i = " + i1 + ", j = " + j1);

    }
}

Когда вы передаете объект Java, например массив или строку методу, это означает, что вы передаете ссылку (адрес ваших данных), а не дубликат. Поэтому, если вы измените данные в методе, они также будут изменены за его пределами.

public class Main {

    static int[] outer = new int[3];

    public static void swap(int[] array) {
        System.out.println("(swap) Before swap :" + Arrays.toString(array));
        int first = array[0];
        int last = array[array.length - 1];
        array[0] = last;
        array[array.length - 1] = first;
        System.out.println("(swap) After swap :" + Arrays.toString(array));
    }


    public static void main(String[] args) {
        outer[0] = 0;
        outer[1] = 1;
        outer[2] = 2;

        swap(outer);

        System.out.println("(main) After swap :" + Arrays.toString(outer));
    }

8. Попытка работы с неинициализированным полем или переменной

Работа с типом объекта без инициализации довольно опасна.

Переменные класса инициализируются значением по умолчанию (0 для int, 0.0 для double, false для логического значения, null для непримитивных типов (объектов).

public class Test2 {
    static String test;

    public static void main(String[] args) {

     System.out.println(test);
    }
}

Результатом является:

Null

Когда вы работаете с переменными локального метода, вам необходимо инициализировать их вручную, иначе вы получите ошибку компиляции.

public class Test2 {

    public static void main(String[] args) {
        String test2;
     System.out.println(test2);
    }
}

Результатом является:

Error:(6, 28) java: variable test2 might not have been initialized

9. Забывая о целочисленном делении

Если вы разделите один на другой int, вы получите его снова. Итак, в данном случае не 0,5:

public static void main(String[] args) {

        int i = 1;
        int j = 2; 
  int k = i/j; //here we've got 0 
  }

Вы можете узнать о разделении и реальных типах из Java Syntax quest Code Gym и решить множество задач по кодированию, связанных с этой темой.

10. Беспорядок с порядком вызова конструкторов в дочерних объектах

Когда вы пытаетесь создать экземпляр дочернего класса, сначала вызывается дочерний класс, а затем родительский. Порядок выполнения конструкторов в отношениях Родитель-потомок строится от базового (родительского) класса к унаследованному (Дочернему).

public class Test3 {
    static class Parent {
        Parent() {
            System.out.println("a Parent is created");
        }
    }
    static class Child extends Parent {
        Child(){
            System.out.println("a Child is created");
        }
    }

    public static void main(String[] args) {
        Child child = new Child();
    }
}

Выход:

a Parent is created
a Child is created

Если вы присоединитесь к Code Gym, вы познакомитесь с ООП и наследованием в Поиск ядра Java . Задач по этой теме действительно много. Так что рано или поздно вы получите тонкое представление о принципах ООП.

Я полагаю, что нет статьи, которая могла бы собрать все потенциальные ошибки начинающих студентов Java. Тем не менее, такие списки очень полезны, чтобы избежать распространенных ошибок… и успевайте находить менее тривиальные проблемы! Премонитус, премонитус (* предупрежден – значит вооружен).

Однако самый важный шаг – это не избегать ошибок, а практиковать само кодирование. Вот почему мы создали Code Gym , базовый курс Java с более чем 1000 практическими заданиями, увлекательными лекциями и мгновенной обратной связью о ваших улучшениях. Когда вы совершаете ошибку, популярную или редкую, система Code Gym предупреждает вас об этом и дает рекомендации, как ее избежать. Попробуйте пройти курс самостоятельно, на данный момент он бесплатный.

Не прекращайте практиковаться, и вы наверняка станете лучшим разработчиком программного обеспечения. Удачи вам в обучении!

P.S.: Вы когда-нибудь допускали ошибки в этой статье? С какими ошибками вы столкнулись во время обучения? Расскажите нам в комментариях!

Сообщение Алекса Еленевича, энтузиаста индустрии компьютерного программного обеспечения и директора по маркетингу в CodeGym.cc . Впервые было опубликовано в блоге Code Gym Medium .

Оригинал: “https://dev.to/codegym_cc/top-10-1-common-mistakes-every-java-learner-makes-4b6i”