본문 바로가기
프로그래밍팁

NullPointerException은 무엇이며 어떻게 해결합니까?

by 케야르 2021. 1. 28.

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

예외로 인해 프로그램이 조기에 종료되는 것을 막기 위해 원인을 파악하기 위해 어떤 방법 / 도구를 사용할 수 있습니까?

 


 

int x;

x = 10;

 

이 예에서 변수 x는 an int이고 Java 가이를 초기화 0합니다. 10두 번째 줄에 의 값을 할당하면의 값이 에서 10참조하는 메모리 위치에 기록됩니다 x.

그러나 참조 유형 을 선언하려고하면 다른 일이 발생합니다. 다음 코드를 사용하십시오.

 

Integer num;

num = new Integer(10);

 

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

두 번째 줄에서 new키워드는 유형의 개체를 인스턴스화 (또는 생성)하는 데 사용되며 Integer포인터 변수 num가 해당 Integer개체에 할당됩니다 .

 NullPointerException당신이 변수를 선언하고 객체를 생성하고 변수 (전화의 내용을 사용하기 전에 변수에 할당하지 않았을 때 발생하는 역 참조를 ). 그래서 당신은 실제로 존재하지 않는 것을 가리키고 있습니다.

역 참조는 일반적으로 .메서드 또는 필드에 액세스하는 데 사용하거나 [배열을 인덱싱하는 데 사용할 때 발생합니다 .

num객체를 만들기 전에 역 참조를 시도 하면 NullPointerException. 가장 사소한 경우 컴파일러는 문제를 포착하여 ""를 알려 num may not have been initialized주지만 때때로 객체를 직접 생성하지 않는 코드를 작성할 수 있습니다.

예를 들어 다음과 같은 방법이있을 수 있습니다.

 

public void doSomething(SomeObject obj)

{

  //do something to obj, assumes obj is not null

   obj.myMethod();

}

 

이 경우 객체를 생성하는 obj것이 아니라 doSomething()메서드가 호출 되기 전에 생성되었다고 가정합니다 . 다음과 같이 메서드를 호출 할 수 있습니다.

 

doSomething(null);

 

이 경우 objis null이고 문 obj.myMethod()은 NullPointerException.

메서드가 위의 메서드와 같이 전달 된 개체에 대해 무언가를 수행하도록 의도 된 경우 NullPointerException프로그래머 오류이고 프로그래머가 디버깅 목적으로 해당 정보가 필요하기 때문에 를 throw하는 것이 적절 합니다.

NullPointerException메서드 논리의 결과로 throw되는 s 외에도 메서드 null시작 부분에 다음과 같은 항목을 추가하여 값에 대한 메서드 인수를 확인하고 NPE를 명시 적으로 throw 할 수도 있습니다 .

 

//Throws an NPE with a custom error message if obj is null

Objects.requireNonNull(obj, "obj must not be null");

 

오류 메시지에 어떤 개체가 null. 이를 검증 할 때의 장점은 1)보다 명확한 오류 메시지를 반환 할 수 있고 2) obj재 할당 되지 않는 한 나머지 메서드 에 대해서는 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 }

}

 

마지막으로 Stack Trace를 사용하여 예외 및 원인을 정확히 찾는 방법

예외로 인해 프로그램이 조기에 종료되는 것을 막기 위해 원인을 파악하기 위해 어떤 방법 / 도구를 사용할 수 있습니까?

버그 찾기가있는 Sonar는 NPE를 감지 할 수 있습니다. 수중 음파 탐지기는 JVM으로 인한 널 포인터 예외를 동적으로 포착 할 수 있습니다.

이제 Java 14에는 NullPointerException의 근본 원인을 보여주는 새로운 언어 기능이 추가되었습니다. 이 언어 기능은 2006 년부터 SAP 상용 JVM의 일부였습니다. 다음은이 놀라운 언어 기능을 이해하기 위해 2 분 동안 읽었습니다.

https://jfeatures.com/blog/NullPointerException

Java 14에서 다음은 샘플 NullPointerException 예외 메시지입니다.

스레드 "main"java.lang.NullPointerException : "list"가 널이기 때문에 "java.util.List.size ()"를 호출 할 수 없습니다.