CodeGym /Java 博客 /随机的 /菜鸟程序员常犯的8个错误
John Squirrels
第 41 级
San Francisco

菜鸟程序员常犯的8个错误

已在 随机的 群组中发布
你好!今天,我们将了解新手(和其他)Java 开发人员犯的 8 个非常常见的错误。您会在网络上找到大量此类列表:其中许多彼此相似。当我们编制清单时,我们遵循一个标准:我们是否在学习或就业期间自己犯了错误 :) 它们没有按重要性排序——它们对您理解和记住同样重要。
  1. 使用==比较对象。

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

    引用指向内存中的地址。如果它们存储在不同的地址,则使用==进行比较将返回false

    
    public class Vehicle {
     
        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()的要求列表。您可以轻松地在 Internet 上找到它们。

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

    如果您曾看到消息“无法从静态上下文中引用非静态变量 x”,欢迎加入俱乐部 :)

    静态方法无法访问非静态(实例)变量。

    这是有道理的:毕竟,静态方法可以在不创建其类的对象的情况下被调用,并且所有字段都属于特定对象。这就是导致错误的矛盾所在。

    顺便说一下,换一种方式也行得通:您可以在非静态方法中使用静态变量:

    
    public class Main {
     
        public int x = 10;
     
        public static int staticX = 100;
     
        public static void main(String[] args) {
     
            System.out.println(x); // Compilation error - you can't do this!
        }
     
        public void printX() {
     
            System.out.println(staticX); // But you can do this!
        }
    }
    

  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. 忽略编码规则。

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

    所有这些规则(如何命名变量,如何编写方法名称)都是出于某种原因而发明的。它们真正影响代码的可读性

    毕竟,代码不会永远是你一个人的。您可能会被调到公司的另一个项目。继承你代码的同事看到这样的事情显然不会高兴:

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

    您的代码可能具有巧妙的高性能,但如果无法阅读和理解它的实际工作原理,那么它就没有多大价值。

    如果你坚持编码标准,那么即使你的代码远非理想,至少你更有经验的同事能够告诉你如何从技术角度改进它:)

  5. 对String类的误解

    
    public class Main {
     
        public static void main(String[] args) {
     
            String s1 = "I'm learning Java";
            String s2 = new String("I'm learning Java");
     
            System.out.println(s1 == s2);
        }
    }
    

    如果你不知道为什么这段代码显示false,你显然需要加强你的知识 :)

    初学者通常不知道字符串池及其工作原理。

    因此,他们并不完全了解如何在代码中正确比较字符串。我们在其中一节课中详细探讨了这个主题。

  6. 错误地处理异常。

    初学者并不是唯一偶然发现这一点的人。经验丰富的开发人员也会被绊倒。原因很多。

    首先,没有万能的配方。程序有各种不同的错误和不同的错误处理场景。

    其次,并不是每个人都了解堆栈跟踪的结构。有很多错误处理反模式,它们中的每一个都以自己的方式“错误”。这意味着错误处理比其他任何事情都容易出错。

  7. 不完全理解运算符(算术、逻辑等)的工作原理。

    菜鸟程序员常犯的 8 个错误 - 2

    这是一个简单的例子。你能马上看出这段代码将显示什么吗?

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

    如果您回答错误或只是猜到了,那么您在这方面仍然存在知识空白 :)

    代码将显示false,因为相等运算符 ( == ) 比后缀递增运算符 ( ++ ) 具有更高的优先级。因此,先执行7 == i比较,然后才执行i++操作。

    对了,我们也有这方面的详细教训。如果你错过了,这里是链接。

  8. switch语句中省略单词break

    很多看这篇文章的人肯定都犯过这个错误!:)

    
    public class Main {
     
        public static void main(String[] args) {
     
            int i = 1;
     
            switch (i) {
     
                case 1: {
                    System.out.println("The number is equal to 1");
                }
                case 2: {
                    System.out.println("The number is equal to 2");
                }
                case 3: {
                    System.out.println("The number is equal to 3");
                }
            }
        }
     }
    

    结果,执行遍历了所有可能的选项:

    输出:

    数字等于1 数字等于2 数字等于3

    当其中一个选项执行完毕时,break语句会中断switch语句的执行。不要忘记它,否则你可能会得到意想不到的结果:)

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