Null 포인터 예외 (java.lang.NullPointerException)는 무엇이며 그 원인은 무엇입니까?

참조 변수 (예 : 객체)를 선언하면 실제로 객체에 대한 포인터가 생성됩니다. 기본 유형의 변수를 선언하는 다음 코드를 고려하십시오. int

int x;
x = 10;

이 예제에서 변수 x는 int이고 자바는 0으로 초기화합니다. 두 번째 줄에 값 10을 지정하면 x로 참조되는 메모리 위치에 값 10이 기록됩니다.
그러나 참조 유형을 선언하려고하면 다른 결과가 발생합니다. 다음 코드를 취하십시오.

Integer num; 
num = new Integer(10);

첫 번째 줄은 num이라는 변수를 선언하지만 실제로 아직 원시 값을 포함하지는 않습니다. 대신 포인터가 포함됩니다 (유형이 참조 유형 인 정수이기 때문에). 아직 무엇을 가리킬 지 말하지 않았기 때문에 Java는 null로 설정합니다. 즉 "나는 아무 것도 가리키고 있지 않습니다."라는 의미입니다.

두 번째 줄에서는 new 키워드를 사용하여 Integer 유형의 객체를 인스턴스화 (또는 생성)하고 포인터 변수 num을 해당 Integer 객체에 할당합니다.

NullPointerException은 변수를 선언했지만 객체를 만들지 않았을 때 발생합니다. 그래서 당신은 실제로 존재하지 않는 무언가를 가리키고 있습니다.

객체를 만들기 전에 num을 참조 해제하려고하면 NullPointerException이 발생합니다. 가장 간단한 경우 컴파일러는 문제를 파악하여 "num이 초기화되지 않았을 수 있습니다."라고 알려주지만 때때로 객체를 직접 생성하지 않는 코드를 작성할 수도 있습니다.
예를 들어 다음과 같은 방법이있을 수 있습니다.

public void doSomething(SomeObject obj) { 
//do something to obj 
}

어떤 경우에는 obj 객체를 만들지 않고 doSomething () 메서드가 호출되기 전에 만들어 졌다고 가정합니다. 다음과 같이 메소드를 호출 할 수 있습니다.

doSomething(null);

이 경우 obj는 null입니다. 이 메소드가 전달 된 객체에 뭔가를하려는 경우 NullPointerException이 throw되는 것이 적절합니다. 프로그래머가 오류이므로 프로그래머가 디버깅을 위해 해당 정보를 필요로하기 때문입니다.

대안으로, 메소드의 목적이 전달 된 객체에서만 작동하는 것이 아닌 경우가 있으므로 null 매개 변수가 허용 될 수 있습니다. 이 경우, 널 (NULL) 매개 변수를 점검하고 다르게 작동해야합니다. 또한 설명서에서 이 내용을 설명해야합니다. 예를 들어 doSomething ()은 다음과 같이 작성할 수 있습니다.

/** * @param obj An optional foo for ____. May be null, in which case 
* the result will be ____. 
*/ 
public void doSomething(SomeObject obj) { 
  if(obj != null) { 
  	//do something 
  } else { 
  	//do something else 
  } 
}

https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it

+ Recent posts