지역 변수 뒤에있는 아이디어는 그들이 필요한 제한된 범위 내에서만 존재한다는 것입니다. 따라서 그 가치 또는 적어도 그 가치가 어디에서 오는지에 대한 불확실성에 대한 이유가 거의 없어야합니다. 지역 변수에 대한 기본값을 가지면서 발생하는 많은 오류를 상상할 수 있습니다.
예를 들어, 다음과 같은 간단한 코드를 고려하십시오 ... ( 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);
모든 것을 말하고 완료 하면 컴파일러가 letterGrade에 기본값 '\ 0'을 할당했다고 가정하면 이 코드는 작성된대로 제대로 작동합니다. 그러나 else 문을 잊어 버린 경우에는 어떻게합니까?
코드를 테스트하면 다음과 같은 결과가 나올 수 있습니다.
Enter grade
43
Your grade is
이 결과는 예상 할 수 있지만 분명히 코더의 의도는 아닙니다. 실제로 대부분의 경우 (또는 적어도 상당수의 경우) 기본값이 원하는 값이 아니므로 대부분의 경우 기본값으로 인해 오류가 발생합니다. = 1
in 을 잊음으로 인한 디버깅 슬픔이 in for(int i = 1; i < 10; i++)
을 포함하지 않아도되는 편리함보다 중요하기 때문에 사용하기 전에 코더가 로컬 변수에 초기 값을 할당하도록하는 것이 더 합리적 = 0
입니다 for(int i; i < 10; i++)
.
예를 들어 객체가 생성자에서 확인 된 예외를 던질 때 try-catch-finally 블록이 약간 지저분해질 수 있다는 것은 사실입니다 (하지만 실제로는 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에서이 finally 블록은 더 이상 try-with-resources를 사용하여 필요하지 않습니다.
try (Scanner s = new Scanner(new FileInputStream(new File("filename.txt")))) {
...
...
} catch(IOException e) {
System.out.println("different error message");
}
즉, (이름에서 알 수 있듯이) 이것은 리소스에서만 작동합니다.
그리고 앞의 예제는 약간 엉뚱하지만, 이것은 아마도 지역 변수와 그것들이 구현되는 방법에 대해 말하는 것보다 try-catch-finally 또는 이러한 클래스가 구현되는 방식에 더 많은 것을 말합니다.
필드가 기본값으로 초기화되는 것은 사실이지만 약간 다릅니다. 예를 들어라고 말하면 int[] arr = new int[10];
이 배열을 초기화하자마자 객체가 지정된 위치의 메모리에 존재합니다. 잠시 동안 기본값이 없다고 가정 해 봅시다. 대신 초기 값은 그 순간에 해당 메모리 위치에있는 일련의 1과 0입니다. 이로 인해 많은 경우 비 결정적 동작이 발생할 수 있습니다.
우리가 ...
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의 각 요소는 String (또는 null)을 가리켜 야합니다. 그러나 초기 값이이 메모리 위치에서 발생하는 일련의 0과 1이면 매번 동일한 결과를 얻을 수있을뿐만 아니라 객체 s [0]이 가리키고 있다는 보장도 없습니다. 에도 (그것이 어떤 의미를 가리키는 가정) 이다 문자열은 (아마도 그것은 토끼,이다 : P )! 유형에 대한 이러한 관심 부족은 Java Java를 만드는 거의 모든 것에 직면하게 될 것입니다. 따라서 지역 변수에 대한 기본값을 갖는 것은 기껏해야 선택 사항으로 보일 수 있지만 인스턴스 변수에 대한 기본값을 갖는 것은 필요성에 더 가깝습니다 .