-
การเปรียบเทียบวัตถุโดยใช้==
ตัว ดำเนินการ ==เปรียบเทียบการอ้างอิงวัตถุ
การอ้างอิงชี้ไปยังที่อยู่ในหน่วยความจำ หากเก็บไว้ในที่อยู่ที่แตกต่างกัน การเปรียบเทียบโดยใช้==จะส่งคืนค่าเท็จ
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); } }
ในการเปรียบเทียบอ็อบเจกต์ คลาส อ็อบเจกต์มีเมธอดพิเศษ: equals( ) การใช้งานเริ่มต้นนั้นไม่เลวเลย:
public boolean equals(Object obj) { return (this == obj); }
ใน คลาส อ็อบเจกต์เอง จะใช้เมธอด เท่ากับ ()เพื่อเปรียบเทียบการอ้างอิงสองตัว ในทางกลับกัน เพื่อที่จะเปรียบเทียบวัตถุได้อย่างถูกต้อง คุณต้องกำหนดวิธีการนี้ใหม่ตามเกณฑ์ที่เกี่ยวข้องในโปรแกรมเฉพาะของคุณสำหรับวัตถุเฉพาะของคุณ เกณฑ์ความเท่าเทียมกันขึ้นอยู่กับคุณ
สิ่งเดียวที่คุณต้องไม่ลืมคือรายการข้อกำหนดสำหรับการเอาชนะเท่ากับ () อย่างถูก ต้อง คุณสามารถค้นหาได้อย่างง่ายดายบนอินเทอร์เน็ต
-
การใช้ตัวแปรที่ไม่คงที่ในวิธีคงที่ (และในทางกลับกัน)
หากคุณเคยเห็นข้อความ "ตัวแปรไม่คงที่ 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! } }
-
ความเข้าใจผิดว่าอาร์กิวเมนต์ถูกส่งผ่านไปยังเมธอดอย่างไร: โดยการอ้างอิงหรือตามค่า
ออบเจกต์และวัตถุดั้งเดิมถูกส่งผ่านไปยังเมธอดในสองวิธี: วิธีแรกโดยการอ้างอิง ประการที่สองตามมูลค่า
ผู้เริ่มต้นมักพบว่าเป็นการยากที่จะเข้าใจแนวคิดนี้ เป็นผลให้รหัสทำงานโดยไม่คาดคิด:
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++; } }
หากคุณไม่ทราบแน่ชัดว่าจำนวนใดจะเพิ่มขึ้นและจำนวนใดจะไม่เพิ่มขึ้น (จำนวนเดิมธรรมดาหรืออายุของแมว) ให้อ่านบทเรียนของเราอีกครั้งในหัวข้อ
-
ละเว้นกฎการเข้ารหัส
สิ่งนี้ไม่เพียงใช้กับการปฏิบัติตามหลักการ "ทางเทคนิค" บางอย่างเท่านั้น แต่ยังใช้กับแบบแผนการตั้งชื่อทั่วไปด้วย
กฎทั้งหมดเหล่านี้ (วิธีตั้งชื่อตัวแปร วิธีเขียนชื่อเมธอด) ถูกประดิษฐ์ขึ้นด้วยเหตุผล มันส่งผลต่อความสามารถในการอ่านโค้ดอย่างแท้จริง
ท้ายที่สุดรหัสจะไม่เป็นของคุณคนเดียวเสมอไป คุณอาจถูกโอนไปยังโครงการอื่นที่บริษัทของคุณ เพื่อนร่วมงานของคุณที่รับรหัสของคุณจะไม่พอใจอย่างเห็นได้ชัดเมื่อพวกเขาเห็นสิ่งนี้:
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; }
โค้ดของคุณอาจมีประสิทธิภาพสูงอย่างแยบยล แต่ถ้าไม่สามารถอ่านและเข้าใจว่ามันทำงานจริงได้อย่างไร อนิจจา มันก็ไม่มีค่าอะไรมาก
หากคุณยึดติดกับมาตรฐานการเขียนโค้ด แม้ว่าโค้ดของคุณจะยังห่างไกลจากอุดมคติ แต่อย่างน้อยเพื่อนร่วมงานที่มีประสบการณ์มากกว่าจะสามารถบอกคุณได้ว่าโค้ดนั้นสามารถปรับปรุงได้อย่างไรจากมุมมองทางเทคนิค :)
-
ความเข้าใจผิดเกี่ยวกับคลาส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); } }
หากคุณไม่รู้ว่าเหตุใดรหัสนี้จึงแสดงเป็นเท็จคุณต้องเพิ่มพูนความรู้ของคุณอย่างเห็นได้ชัด :)
ผู้เริ่มต้นมักจะไม่รู้จักString Poolและวิธีการทำงาน
เป็นผลให้พวกเขาไม่เข้าใจวิธีการเปรียบเทียบสตริงในโค้ดอย่างถูกต้อง เราได้สำรวจหัวข้อนี้อย่างละเอียดในบทเรียนหนึ่งของเรา
-
จัดการข้อยกเว้นอย่างไม่ถูกต้อง
มือใหม่ไม่ใช่คนเดียวที่สะดุดกับสิ่งนี้ นักพัฒนาที่มีประสบการณ์ก็สะดุดเช่นกัน เหตุผลมีมากมาย
ประการแรกไม่มีสูตรสากล โปรแกรมมีข้อผิดพลาดที่แตกต่างกันทุกประเภทและสถานการณ์การจัดการข้อผิดพลาดที่แตกต่างกัน
ประการที่สอง ไม่ใช่ทุกคนที่เข้าใจว่าสแต็กเทรซมีโครงสร้าง อย่างไร มีข้อผิดพลาดมากมายในการจัดการกับรูปแบบต่อต้าน และแต่ละข้อก็ "ผิด" ในแบบของตัวเอง ซึ่งหมายความว่าการจัดการข้อผิดพลาดผิดพลาดได้ง่ายกว่าสิ่งอื่นใด
-
ไม่เข้าใจวิธีการทำงานของตัวดำเนินการ (เลขคณิต ตรรกะ และอื่นๆ) อย่างถ่องแท้
นี่เป็นตัวอย่างง่ายๆ คุณสามารถบอกได้ทันทีว่ารหัสนี้จะแสดงอะไร?
public class Main { public static void main(String[] args) { int i = 6; System.out.println(7 == i++); } }
หากคุณตอบผิดหรือแค่เดา แสดงว่าคุณยังมีช่องว่างความรู้ในด้านนี้ :)
รหัสจะแสดงเป็นเท็จเนื่องจากตัวดำเนินการความเท่าเทียมกัน ( == ) มีลำดับความสำคัญสูงกว่าตัวดำเนินการเพิ่มค่าหลัง ( ++ ) ดังนั้น การเปรียบเทียบ 7 == iจะถูกดำเนินการก่อน และดำเนินการ i++ เท่านั้น
อย่างไรก็ตาม เรายังมีบทเรียนโดยละเอียดเกี่ยวกับเรื่องนี้ด้วย นี่คือลิงค์หากคุณพลาด
-
ละเว้น ตัวแบ่งคำในคำสั่งswitch
หลายคนที่อ่านบทความนี้ได้ทำผิดพลาดอย่างแน่นอน! :)
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เมื่อดำเนินการตัวเลือกใดตัวเลือกหนึ่งเสร็จแล้ว อย่าลืมมิฉะนั้นคุณอาจได้รับผลลัพธ์ที่คาดไม่ถึง :)
ข้อผิดพลาดทั่วไป 8 ประการของโปรแกรมเมอร์มือใหม่
สวัสดี! วันนี้เราจะมาดูข้อผิดพลาดทั่วไป 8 ข้อที่เกิดขึ้นโดยนักพัฒนา Java มือใหม่ (และคนอื่นๆ) คุณจะพบรายการดังกล่าวมากมายบนเว็บ หลายรายการมีความคล้ายคลึงกัน เมื่อเรารวบรวมรายการของเรา เราได้รับคำแนะนำจากเกณฑ์เดียว: ไม่ว่าเราจะทำผิดพลาดเองในระหว่างการศึกษาหรือการทำงาน :) เกณฑ์เหล่านี้ไม่ได้ถูกจัดเรียงตามความสำคัญ — เป็นสิ่งสำคัญที่คุณจะต้องเข้าใจและจดจำเท่าๆ กัน
GO TO FULL VERSION