คำสั่งรหัสที่ไม่สามารถเข้าถึงได้เป็นปัญหาทั่วไปของผู้เริ่มต้น Java นักพัฒนามือใหม่จำนวนมากสับสนระหว่างข้อผิดพลาดกับ “โค้ดที่ตายแล้ว” ซึ่งเป็นอีกปรากฏการณ์หนึ่งที่เกี่ยวข้องกับ Java แม้ว่าทั้งสองจะคล้ายกันโดยการสำแดง แต่ก็มีความแตกต่างบางประการที่เราจะกล่าวถึงในโพสต์นี้ นอกเหนือจากนั้น คุณจะพบว่าสาเหตุส่วนใหญ่ที่ทำให้คอมไพเลอร์ของคุณส่งคืนคำสั่งโค้ดที่ไม่สามารถเข้าถึงได้คืออะไร และค้นพบวิธีแก้ไขง่ายๆ เพื่อให้โค้ดของคุณทำงานอีกครั้ง
รหัสที่ไม่สามารถเข้าถึงได้คืออะไร?
ตามคำนิยาม คำสั่งที่ไม่สามารถเข้าถึงได้คือคำสั่งที่คอมไพเลอร์จะไม่ดำเนินการเมื่อคุณรันโค้ดที่พร้อมใช้งาน คำสั่งส่งคืนรหัสที่ไม่สามารถเข้าถึงได้โดยทั่วไปเป็นสัญญาณของข้อผิดพลาดเชิงตรรกะภายในโปรแกรม แม้ว่าจะมีสาเหตุหลายประการที่ทำให้คุณลงเอยด้วยข้อความดังกล่าว แต่ในทุกกรณี โค้ดที่ไม่สามารถเข้าถึงได้นั้นซ้ำซ้อน ทำให้โปรแกรมของคุณรกรุงรัง และควรหลีกเลี่ยงในทุกกรณีรหัสที่ไม่สามารถเข้าถึงได้กับรหัสที่ตายแล้ว
ในชุมชนการพัฒนา แนวคิดของรหัส "ไม่สามารถเข้าถึงได้" และ "ตาย" มีความหมายเหมือนกัน อย่างไรก็ตาม หากคุณไม่เข้าใจเมื่ออ่านเอกสารประกอบ คุณอาจเห็นว่าแนวทางการพัฒนามักกล่าวถึงทั้งสองอย่างแยกกัน มีความแตกต่างระหว่างรหัสที่ตายแล้วและไม่สามารถเข้าถึงได้หรือไม่? โดยพื้นฐานแล้ว ความแตกต่างระหว่างข้อผิดพลาดทั้งสองอยู่ที่วิธีที่คอมไพเลอร์ตอบสนองต่อข้อผิดพลาดเหล่านั้น หากโค้ดที่คุณป้อนในคอมไพเลอร์ไม่สามารถเข้าถึงได้คุณจะได้รับข้อผิดพลาดรันไทม์คอมไพล์ในการแจ้งเตือน Java หากคำสั่งของคุณคือ " รหัสที่ตายแล้ว " จะไม่มีข้อผิดพลาดรันไทม์ - นักพัฒนาจะได้รับคำเตือนจากระบบต่อไปนี้:class DeadCode {
void deadcode_Method(boolean b) {
System.out.println("Reachable statement");
if(true) {
return;
}
System.out.println("Unreachable statement"); // dead code
}
}
เนื่องจากไม่มีข้อผิดพลาดของคอมไพเลอร์โดยตรงในกรณีของโค้ดที่ตายแล้ว การตรวจจับจึงทำได้ยากขึ้น อย่างไรก็ตาม หากคุณติดตามการส่งคืน System.out.printInอย่างระมัดระวัง การตรวจหาโค้ดที่ตายแล้วจะไม่สร้างปัญหาให้คุณ
เหตุใดคุณจึงได้รับคำสั่งรหัสที่ไม่สามารถเข้าถึงได้
ข่าวดีก็คือ การติดตามสาเหตุของปัญหารหัสที่เข้าไม่ถึงนั้นเป็นเรื่องง่าย มีสาเหตุหลักสามประการที่ทำให้คอมไพเลอร์ของคุณส่งคืนข้อผิดพลาด:- ใบแจ้งยอดโอน. หากคุณทำลายรหัสของคุณด้วยคำสั่ง return จะไม่มีการดำเนินการใดหลังจาก "return = true"
- วนซ้ำไม่สิ้นสุด - ไม่มีโค้ดที่คุณเขียนหลังจากการวนซ้ำไม่สิ้นสุดที่จะถูกดำเนินการเช่นกัน เนื่องจากระบบจะทำซ้ำการดำเนินการวนซ้ำ ดังนั้น เมื่อแปลงรหัสของคุณเป็นรหัสไบต์ คอมไพลเลอร์จะส่งข้อผิดพลาดของรหัสที่ไม่สามารถเข้าถึงได้
คืนงบ
คำสั่ง return เป็นส่วนหนึ่งของกลุ่มคำหลัก Transfer ซึ่งหมายความว่าจะยุติวิธีการของคุณ มีประโยชน์ในการแยกฟังก์ชันและช่วยให้โค้ดของคุณสามารถอ่านได้และสะอาด อย่างไรก็ตาม เนื่องจากคุณไม่สามารถเพิ่มคำสั่งใหม่ให้กับฟังก์ชันหลังจาก return = true การพยายามดำเนินการต่อฟังก์ชันหลังจากคีย์เวิร์ดจะทำให้คุณมีข้อผิดพลาดคอมไพเลอร์ "รหัสที่ไม่สามารถเข้าถึงได้" ลองมาดูตัวอย่างการจัดการที่ไม่ถูกต้องของ “return = true” และวิธีที่คอมไพเลอร์ตอบสนองclass GFG {
public static void main(String args[])
{
System.out.println("My code will run");
return;
// ironically, this code will never run
// here’s an unreachable code message a developer gets.
System.out.println("My code will run");
}
}
ต่อไปนี้คือวิธีการแสดงคำสั่ง return ในทางที่ผิดในคอมไพเลอร์:
prog.java:11: error: unreachable statement
System.out.println(“My code will run”);
^
1 error
เพื่อเสริมสิ่งที่คุณได้เรียนรู้ เราขอแนะนำให้คุณดูบทเรียนวิดีโอจากหลักสูตร Java ของเรา
งบแตก
คำสั่งแบ่งเป็นคำหลักอีกประเภทหนึ่งที่คุณต้องระวังเมื่อเขียนฟังก์ชัน Java ตามนิยาม คีย์เวิร์ด break ใช้เพื่อยุติการวนซ้ำ ในตัวอย่างด้านล่าง เมื่อนักพัฒนาออกจากลูป เขาจะไม่สามารถดำเนินการคำสั่งในบรรทัดที่ 8 ได้อีกต่อไป ดังนั้น คอมไพลเลอร์จะแสดงข้อผิดพลาดของคำสั่งที่ไม่สามารถเข้าถึงได้ นี่คือตัวอย่างโค้ดที่จะส่งผลให้เกิดคำสั่งโค้ดที่ไม่สามารถเข้าถึงได้:public class JavaCodeGeeks
{
public static void main(String[] args) {
for(int i=1;i<5;i++)
{
System.out.println(i);
break;
System.out.println("Code after break");
}
}
}
เมื่อดูข้อผิดพลาดจากมุมมองของคอมไพเลอร์ คุณจะได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้
JavaCodeGeeks.java:8: error: unreachable statement
System.out.println("After break");
^
1 error
แถลงการณ์ต่อไป
ดำเนินการต่อคือคีย์เวิร์ดควบคุมลูปที่ใช้เพื่อย้ำการกระทำ เมื่อใดก็ตามที่คุณต้องการให้การดำเนินการวนซ้ำเริ่มต้นจากศูนย์ด้วยตัวมันเอง ให้เพิ่มการดำเนินการต่อในโค้ดของคุณ คำสั่งนี้มีประโยชน์ในการช่วยนักพัฒนาเลือกว่าคำสั่งใดของลูปที่ต้องการวนซ้ำและคำสั่งใดที่พวกเขาไม่ต้องการให้ทำซ้ำ แม้ว่าการดำเนินการต่อจะเป็นคำหลักที่ตรงไปตรงมา แต่หากไม่มีความเข้าใจอย่างถ่องแท้เกี่ยวกับวิธีการทำงานนั้นจะทำให้นักพัฒนาติดกับดัก "รหัสที่ไม่สามารถเข้าถึงได้" เนื่องจากหลังจากพบการดำเนินการต่อ ระบบจะวนซ้ำ คำหลักจะไม่สามารถเข้าถึงคำสั่งที่ตามมาได้ สมมติว่าคุณมีรหัสต่อไปนี้:public class JavaIsFun
{
public static void main(String[] args) {
for(int i=0;i<8;i++)
{
System.out.println(i);
if(i==5)
{
continue;
System.out.println("Coding after continue");
}
}
}
}
ระบบจะไม่ดำเนินการคำสั่ง "การเข้ารหัสหลังจากดำเนินการต่อ" ของคุณ - คอมไพเลอร์จะแจ้งให้คุณทราบทันที
JavaIsFun.java:10: error: unreachable statement
System.out.println("Coding after continue");
ลูปไม่สิ้นสุด
สถานการณ์ที่คล้ายกับตัวอย่างกรณีการใช้คีย์เวิร์ด "break" และ "continue" คือกรณีของการวนซ้ำไม่สิ้นสุด เมื่อออกแบบการวนซ้ำไม่สิ้นสุด นักพัฒนาควรระลึกไว้เสมอว่าไม่มีคำสั่งใดจะทำงานหลังจากนั้น ดังนั้น หากคุณไม่ทำลายการวนซ้ำ โค้ดทั้งหมดที่เขียนหลังจากนั้นจะไม่สามารถเข้าถึงได้ ต่อไปนี้คือตัวอย่างที่น่าสนใจของการจัดการวนซ้ำที่ไม่ถูกต้องเพื่อตรวจสอบ:public class JavaCodeGym
{
public static void main(String[] args) {
while(true)
{
System.out.println("Hey there");
}
System.out.println("Nice to see you");
}
}
คุณเดาได้ไหมว่าข้อผิดพลาดซ่อนอยู่ที่ใด คอมไพเลอร์จะชี้ไปที่มันทันทีเมื่อคุณรันโค้ด:
//unreachable code statement compiler error
JavaCodeGym.java:10: error: unreachable statement
System.out.println("Nice to see you");
‘
เนื่องจากมีการวนซ้ำไม่สิ้นสุดก่อน คำ ว่า "ยินดีที่ได้รู้จัก"คำสั่งจะไม่ดำเนินการและส่งคืนข้อผิดพลาดของรหัสที่ไม่สามารถเข้าถึงได้