JavaRush /Java 博客 /Random-ZH /新手程序员常犯的8个错误

新手程序员常犯的8个错误

已在 Random-ZH 群组中发布
你好!今天,我们将看看初学者(不仅仅是)Java 开发人员所犯的 8 个常见错误。您会在互联网上找到许多这样的集合:其中许多彼此相似。当我们编制这份清单时,我们遵循一个标准:我们自己在学习和工作中是否犯过这些错误:)它们没有优先顺序,对于理解和记忆同样重要。
  1. 使用 比较对象==

    运算符==比较对象引用。

    引用指向内存中的地址,如果它们位于不同的地址,则比较==将返回false

    public class Car {
    
       String model;
       int maxSpeed;
       int yearOfManufacture;
    
       public Car(String model, int maxSpeed, int yearOfManufacture) {
           this.model = model;
           this.maxSpeed = maxSpeed;
           this.yearOfManufacture = yearOfManufacture;
       }
    
       public static void main(String[] args) {
           Car ferrari = new Car("Ferrari 360 Spider", 280, 1996);
           Car ferrariTwin = new Car("Ferrari 360 Spider", 280, 1996);
           System.out.println(ferrari == ferrariTwin);
       }
    }

    要比较类中的对象,Object有一个特殊的方法 - equals()。坦率地说,它的默认实现是马马虎虎:

    public boolean equals(Object obj) {
       return (this == obj);
    }

    在类本身中,Object方法的逻辑equals()是通过两个引用的比较来实现的。反过来,为了正确比较对象,您需要根据特定程序中针对特定对象的重要标准重新定义此方法。您自己确定平等的标准。

    您唯一不应该忘记的是正确覆盖的要求列表equals()。你可以很容易地在互联网上找到它们,但是我们很酷的学生已经就这个主题写了一篇文章

  2. 在静态方法中使用非静态变量(反之亦然)。

    如果您曾经看到过“非静态变量 x 不能从静态上下文中引用”的字样- 欢迎来到俱乐部:)

    静态方法无法访问非静态类变量。

    这是合乎逻辑的:毕竟,无需创建类对象就可以调用静态方法,并且所有字段变量都属于特定对象。这就是导致错误的矛盾。

    相反,顺便说一句,这是可能的:在非静态方法中允许使用静态变量:

    public class Main {
    
       public int x = 10;
    
       public static int staticX = 100;
    
       public static void main(String[] args) {
    
           System.out.println(x);//ошибка компиляции, так нельзя!
       }
    
       public void printX() {
    
           System.out.println(staticX);//а так можно!
       }
    }
  3. 对参数如何传递给方法的误解:通过引用或通过值。

    对象和基元以不同的方式作为参数传递给方法:前者通过引用,后者通过值。

    初学者经常发现这个概念很难掌握,导致他们的代码表现异常:

    public class Main {
    
       public static void main(String[] args) {
    
           int x = 7;
           incrementNumber(x);
           System.out.println(x);
    
           Cat cat = new Cat(7);
           catLevelUp(cat);
           System.out.println(cat.getAge());
    
       }
    
       public static void catLevelUp(Cat cat) {
    
           cat.setAge(cat.getAge()+1);
       }
    
       public static void incrementNumber(int x) {
           x++;
       }
    }

    如果在这个例子中你不知道哪个数字会增加,哪个不会(通常的数字或猫的年龄),那么请再次阅读我们关于这个主题的讲座

  4. 忽略编写代码的规则。

    这不仅适用于遵守某些“技术”原则,也适用于平庸的命名约定。

    所有这些规则“如何命名变量”、“如何编写方法名称”都是有原因的。这确实极大地影响了代码的可读性。

    Ведь code не всегда будет только твоим. Ты можешь перевестись на другой проект в компании, и он перейдет по наследству к твоим коллегам, которые будут явно не в восторге, получив в работу что-то вроде этого:

    public class Cat {
    
       private int S_O_M_E_T_H_I_N_G = 7;
       public String striiiiiiiiiiiiiing;
       protected double X3_4TO_ET0_TAK0E = 3.14;
       boolean random = Math.random() > 0.5;
    
    }

    Твой code может быть гениальным с точки зрения производительности, но если его невозможно прочитать и понять How он, собственно, работает, цена его, увы, невелика.

    Придерживайся стандартов написания, и твой code, даже далекий от идеала, хотя бы прочтут более опытные товарищи и подскажут, что с технической точки зрения в нем можно улучшить :)

  5. Непонимание работы класса String

    public class Main {
    
       public static void main(String[] args) {
    
           String s1 = "Я изучаю Java";
           String s2 = new String("Я изучаю Java");
    
           System.out.println(s1 == s2);
       }
    }

    Если ты не знаешь, почему этот code выводит false, знания явно нужно подтянуть:)

    Новички часто не знают что такое String Pool и How он работает.

    Как следствие, не до конца ясно, How правильно сравнивать строки в своем codeе. В одной из наших лекций мы подробно рассматривали эту тему

  6. Неправильная работа с исключениями.

    Это свойственно не только новичкам, но и опытным разработчикам. Причин несколько.

    Во-первых, универсального рецепта не существует. Ошибки в программе бывают разные, сценарии их обработки, соответственно, тоже. Во-вторых, не все понимают структуру stackTrace, а антипаттернов обработки ошибок очень много, и каждый из них «неправилен» по-своему. Так что вариантов сделать неправильно здесь намного больше, чем где бы то ни было.

    Распространенные антипаттерны приведены здесь:

  7. Неполное понимание работы операторов (арифметических, логических и других).

    新手程序员的8个常见错误 - 2

    Простой пример. Сможешь сходу сказать, что выведет этот code?

    public class Main {
    
       public static void main(String[] args) {
    
           int i = 6;
           System.out.println(7 == i++);
       }
    }

    Если ты ответил неправильно or наугад, значит, в этой области пока есть пробелы:)

    Код выведет false, потому что приоритет у оператора сравнения == выше, чем у постфиксного инкремента ++. Поэтому сначала будет выполнено сравнение 7 == i, и только потом - операция i++.

    По этой теме, кстати, у нас тоже была подробная лекция. Вот link, если пропустил.

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

    Эту ошибку, вероятно, допускали многие из читателей!)

    public class Main {
    
       public static void main(String[] args) {
    
           int i = 1;
    
           switch (i) {
    
               case 1: {
                   System.out.println("Число равно 1");
               }
               case 2: {
                   System.out.println("Число равно 2");
               }
               case 3: {
                   System.out.println("Число равно 3");
               }
           }
       }
    }

    В результате на них обрушивается водопад из всех возможных вариантов:

    Вывод:

    
    Число равно 1
    Число равно 2
    Число равно 3

    Оператор break прерывает работу оператора switch в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION