2017-04-19 12 views
-1

System.out이 println()을 호출하는 방법을 이해하려고합니다. 모든 검색 결과에 따르면 System.out은 PrintStream 클래스의 인스턴스이므로 해당 클래스의 메서드를 호출 할 수 있습니다.참조 변수를 통한 메소드 호출

하지만 ...

나는이 NullPointerException이 결과를 다음과 같이이를 복제하려고

.

public class Main { 
    public static void main(String[] args){ 
     Tasker.calc.add(1, 2); 
    } 
} 

class Tasker{ 
    static Calc calc; 
} 

class Calc { 
    public void add(int x, int y){ 
     System.out.println(x+y); 
    } 
} 

Tasker.calc와 비슷한 Calc 인스턴스가 아닌가요? System.out은 NullPointerException이 아닌 방법은 무엇입니까?

이것은 분명히 NullPointerException에 관한 질문이 아닙니다 ... System.out에 초기화가 필요없는 이유에 대한 질문입니다.

감사합니다.

+0

당신은 결코'Tasker.calc'를 초기화하지 않았으므로이 예외가 발생했습니다. 시작하기 전에 훌륭한 Java 튜토리얼을 읽으십시오. 오라클의 길은 좋은 시작입니다. –

+0

계산을 초기화하지 않았습니다 – Oswald

+0

'calc' 변수를 초기화하지 않았습니다. 따라서 값은 'null'입니다. 반대로 Java 런타임은 자동으로'System '을 초기화합니다.out "을 null이 아닌 값으로 설정하십시오.) –

답변

2

System.out 초기화가 필요하지 않습니까? 음 ...

System 클래스 내부에는 JVM이 호출하는 initializeSystemClass이라는 메서드가 있습니다. System.out을 올바른 값으로 설정하므로 사용자가 변경할 필요가 없습니다.

System.outPrintStream의 인스턴스가 아니며, PrintStream의 인스턴스에 대한 참조입니다.

1

calc이 (가) 초기화되지 않았습니다. (석회질의 정의에 따라) 당신

static Calc calc = new Calc(); 

를 작성하고 그것을 일 것이다.

+0

왜 내가이 질문에 대답하지 않겠습니까? –

0

@LouisWasserman이 지적했듯이 코드에서 NPE를 제공하는 이유는 calc 변수를 초기화하지 않았기 때문입니다. 결과적으로 이 기본값 인에서 null으로 초기화됩니다. 해결책 : 그것을 초기화하십시오!

그러나 더 깊은 질문은 System.out을 초기화 할 필요가없는 이유입니다. 이는 Java 런타임이 응용 프로그램의 (외부) 표준 출력을 참조하는 PrintStream을 가리 키도록 배후에서 초기화하기 때문입니다.

  • System.out은 초기화 작업을 수행 할 필요가 없으므로 초기화 할 필요가 없습니다. javadocs 이렇게 말하십시오.
  • System.outfinal으로 선언되었으므로이를 초기화 할 수 없습니다. 심지어 System.setOut(...)
  • 는 응용 프로그램이 System.out 설정을해야 무엇인지 찾을 수있는 방법이 없습니다 (그러나 System.setOut(...)있다). (고려해보십시오 java Test | wc)