2014-06-13 2 views
0

아래의 예제 코드에서 "스캐너 검사"및 "문자열 [] 단어"가 선언되었을 때 'null'이 할당되었음을 확인했습니다. 왜 우리가 그렇게해야합니까? 당신의 도움에 많은 감사드립니다! * 예제 코드는 파일의 첫 번째 줄이 문자열 수인 파일에서 문자열을 읽도록 설계되었습니다. int howMany.생성자를 사용할 때 왜 null 값을 할당해야합니까? Java

int howMany; 
Scanner scan = null; //why do we need to assign a 'null'? 
File f; 
String[] words = null; //why not use String[] words= new String []; ? 

try { 
    f = new File(filename); 
    scan= new Scanner(f); 
    howMany = scan.nextInt(); 
    words = new String[howMany]; 

    for (int i = 0; i < howMany; i++) { 
    words[i] = scan.next(); 
    } 
} catch (IOException e) { 
    System.out.println(e); 
} 
+2

"기본값"으로 남겨 두는 것은 좋지 않습니다. 명시 적으로 지정하는 것이 더 명확합니다. – Mephy

+0

로컬 변수는 기본값으로 초기화되지 않으므로 이상한 결과와 반복 불가능한 결과를 방지하기 위해 "알려진"값을 제공해야합니다. – MadProgrammer

+1

두 경우 모두 변수를 정의하고 초기화하는 것이 더 적합했을 것입니다 예를 들어, 'howMany'가 알려졌을 때와 같은 코드의 후반부에서. – EJP

답변

0

첫 번째 질문에서 스캐너를 null로 초기화하는 이유는 무엇입니까? 당신이하지 않았다고 가정하십시오. 코드 예제에서이 것은별로 중요하지 않지만 try 블록, catch 또는 finally 블록 또는 Scanner 객체를 메서드에서 반환하려면 Scanner 객체를 사용하려면 어떻게해야합니까? 스캐너 (또는 컴파일러)는 런타임까지 try 블록에서 어떤 일이 발생 하는지를 반드시 알 필요가 없기 때문에 검사 ​​프로그램이 초기화되지 않았을 수 있습니다. Scanner를 null로 인스턴스화 할 필요는 없습니다. 일반적으로 try 블록 외부에서 IO 객체를 인스턴스화하는 일반적인 장소입니다. 일반적으로 try 블록 외부에서 해당 IO 객체를 사용하여 무언가를 수행해야하므로 닫는 것입니다.

둘째로 : "왜 String [] words = new String [];을 사용하지 않습니까?" 배열 초기화 프로그램은 '['와 ']'사이의 양을 필요로하고 양은 scan.nextInt()에서 파생됩니다. 실행 라인. null로 초기화되는 이유는 무엇입니까? 첫 번째 문단.

범위를 제한 할 때까지 개체를 선언하지 않는 것이 좋은 철학/전략이며, 확장으로 필요할 때까지 개체를 초기화하지 않는 것이 좋습니다. 이들 중 하나를 미리 Null로 설정하면 이익보다 해를 입히고 NPE까지 열어줍니다. Java는 배열 구성 요소, 클래스 변수 및 인스턴스 변수를 기본적으로 null로 초기화합니다. 변수가이 범주에 속하지 않으면 첫 번째 단락 상황이 그렇지 않으면 강제로 초기화되지 않은 채로 둡니다. 컴파일러가 처음 초기화하지 않고 사용하면 경고합니다 (이것은 개발자를위한 보호 메커니즘입니다.)

질문에 답하기 위해 주어진 예에서 그렇게 할 필요가 없으며 그렇게해서는 안됩니다.

관련 문제