CodeGym /Java Blog /Toto sisi /菜鳥程序員常犯的8個錯誤
John Squirrels
等級 41
San Francisco

菜鳥程序員常犯的8個錯誤

在 Toto sisi 群組發布
你好!今天,我們將了解新手(和其他)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