แนวคิดเบื้องหลังตัวแปรท้องถิ่นคือพวกมันมีอยู่ในขอบเขต จำกัด ที่จำเป็นเท่านั้น ดังนั้นจึงควรมีเหตุผลเพียงเล็กน้อยสำหรับความไม่แน่นอนเกี่ยวกับมูลค่าหรืออย่างน้อยที่สุดก็คือมูลค่านั้นมาจากไหน ฉันสามารถจินตนาการถึงข้อผิดพลาดมากมายที่เกิดจากการมีค่าเริ่มต้นสำหรับตัวแปรภายในเครื่อง
ตัวอย่างเช่นพิจารณาโค้ดง่ายๆต่อไปนี้ ... ( NB ให้เราสมมติเพื่อวัตถุประสงค์ในการสาธิตว่าตัวแปรโลคัลได้รับการกำหนดค่าเริ่มต้นตามที่ระบุไว้หากไม่ได้เริ่มต้นอย่างชัดเจน )
System.out.println("Enter grade");
int grade = new Scanner(System.in).nextInt(); //I won't bother with exception handling here, to cut down on lines.
char letterGrade; //let us assume the default value for a char is '\0'
if (grade >= 90)
letterGrade = 'A';
else if (grade >= 80)
letterGrade = 'B';
else if (grade >= 70)
letterGrade = 'C';
else if (grade >= 60)
letterGrade = 'D';
else
letterGrade = 'F';
System.out.println("Your grade is " + letterGrade);
เมื่อพูดและทำเสร็จแล้วสมมติว่าคอมไพเลอร์กำหนดค่าเริ่มต้นเป็น '\ 0' ให้กับ letterGradeโค้ดนี้ตามที่เขียนจะทำงานได้อย่างถูกต้อง อย่างไรก็ตามถ้าเราลืมคำสั่งอื่นล่ะ?
การทดสอบโค้ดของเราอาจส่งผลดังต่อไปนี้
Enter grade
43
Your grade is
ผลลัพธ์นี้ไม่ได้เป็นไปตามเจตนาของผู้เขียนโค้ด อันที่จริงอาจเป็นไปได้ว่าในกรณีส่วนใหญ่ (หรืออย่างน้อยก็คือตัวเลขที่มีนัยสำคัญ) ค่าเริ่มต้นจะไม่เป็นค่าที่ต้องการดังนั้นในกรณีส่วนใหญ่ค่าเริ่มต้นจะทำให้เกิดข้อผิดพลาด มันทำให้รู้สึกมากขึ้นในการบังคับ coder ในการกำหนดค่าเริ่มต้นให้กับตัวแปรท้องถิ่นก่อนที่จะใช้มันตั้งแต่ความเศร้าโศกของการแก้ไขข้อบกพร่องที่เกิดจากการลืม= 1
ในfor(int i = 1; i < 10; i++)
มากเมื่อเทียบกับความสะดวกในการไม่ต้องรวมถึงที่ใน= 0
for(int i; i < 10; i++)
เป็นเรื่องจริงที่การบล็อกแบบ try-catch ในที่สุดอาจยุ่งเล็กน้อย (แต่จริงๆแล้วมันไม่ใช่ catch-22 อย่างที่อ้างถึง) ตัวอย่างเช่นเมื่อวัตถุพ่นข้อยกเว้นที่ตรวจสอบแล้วในตัวสร้าง แต่สำหรับหนึ่ง เหตุผลหรืออย่างอื่นต้องทำบางอย่างกับวัตถุนี้ในตอนท้ายของบล็อกในที่สุด ตัวอย่างที่สมบูรณ์แบบคือเมื่อต้องจัดการกับทรัพยากรซึ่งต้องปิด
วิธีหนึ่งในการจัดการเรื่องนี้ในอดีตอาจเป็นเช่นนั้น ...
Scanner s = null; //declared and initialized to null outside the block. This gives us the needed scope, and an initial value.
try {
s = new Scanner(new FileInputStream(new File("filename.txt")));
int someInt = s.nextInt();
} catch (InputMismatchException e) {
System.out.println("Some error message");
} catch (IOException e) {
System.out.println("different error message");
} finally {
if (s != null) //in case exception during initialization prevents assignment of new non-null value to s.
s.close();
}
อย่างไรก็ตามสำหรับ Java 7 ในที่สุดการบล็อกนี้ก็ไม่จำเป็นอีกต่อไปโดยใช้ try-with-resources เช่นนั้น
try (Scanner s = new Scanner(new FileInputStream(new File("filename.txt")))) {
...
...
} catch(IOException e) {
System.out.println("different error message");
}
ที่กล่าวว่า (ตามชื่อ) สิ่งนี้ใช้ได้กับทรัพยากรเท่านั้น
และในขณะที่ตัวอย่างก่อนหน้านี้ค่อนข้างน่าเบื่อ แต่สิ่งนี้อาจพูดถึงวิธีการลองจับในที่สุดหรือใช้คลาสเหล่านี้มากกว่าที่จะพูดถึงตัวแปรท้องถิ่นและวิธีการนำไปใช้
เป็นความจริงที่ว่าช่องต่างๆจะเริ่มต้นเป็นค่าเริ่มต้น แต่จะแตกต่างกันเล็กน้อย ตัวอย่างเช่นเมื่อคุณพูดว่าint[] arr = new int[10];
ทันทีที่คุณเริ่มต้นอาร์เรย์นี้วัตถุจะอยู่ในหน่วยความจำ ณ ตำแหน่งที่กำหนด สมมติว่าไม่มีค่าเริ่มต้นสักครู่ แต่แทนค่าเริ่มต้นคือชุดของ 1s และ 0s ใด ๆ ที่เกิดขึ้นในตำแหน่งหน่วยความจำนั้นในขณะนั้น สิ่งนี้อาจนำไปสู่พฤติกรรมที่ไม่ได้กำหนดในหลาย ๆ กรณี
สมมติว่าเรามี ...
int[] arr = new int[10];
if(arr[0] == 0)
System.out.println("Same.");
else
System.out.println("Not same.");
จะเป็นไปได้อย่างสมบูรณ์แบบที่Same.
อาจแสดงในการรันหนึ่งและNot same.
อาจแสดงในอีกรันหนึ่ง ปัญหาอาจจะยิ่งหนักใจเมื่อคุณเริ่มพูดถึงตัวแปรอ้างอิง
String[] s = new String[5];
ตามคำจำกัดความแต่ละองค์ประกอบของ s ควรชี้ไปที่สตริง (หรือเป็นโมฆะ) อย่างไรก็ตามหากค่าเริ่มต้นเป็นอนุกรม 0 และ 1 ใด ๆ ที่เกิดขึ้นที่ตำแหน่งหน่วยความจำนี้ไม่เพียง แต่จะไม่มีการรับประกันว่าคุณจะได้ผลลัพธ์เดียวกันในแต่ละครั้ง แต่ยังไม่มีการรับประกันว่าวัตถุนั้นมี [0] คะแนน ถึง (สมมติว่ามันชี้ไปที่อะไรก็ตามที่มีความหมาย) แม้จะเป็นสตริง (อาจจะเป็นกระต่ายก็ได้: p )! การขาดความกังวลสำหรับประเภทนี้จะบินไปเผชิญหน้ากับทุกสิ่งที่ทำให้ Java Java ดังนั้นในขณะที่มีค่าเริ่มต้นสำหรับตัวแปรท้องถิ่นอาจจะเห็นเป็นตัวเลือกที่ดีที่สุดที่มีค่าเริ่มต้นสำหรับตัวแปรเช่นเป็นผู้ใกล้ชิดกับความจำเป็น