Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

java.lang.NullPointerException 오류를 해결하는 방법

Java 기반 응용 프로그램에서 작업했다면 NullPointerException이라는 것을 발견했을 것입니다. Null 포인터 예외는 Java 애플리케이션 개발에서 가장 흔한 오류 중 하나입니다. 이 예외는 일반적으로 사람의 실수로 인해 발생하지만 이와 같은 오류를 디버깅하는 데 시간이 낭비될 수 있습니다. 이 문제는 완전히 구문 오류가 아니므로 때때로 문제를 식별하기가 까다로울 수 있습니다.

이 기사에서는 java.lang.NullPointerException이 무엇인지, 왜 발생하는지, 어떻게 고칠 수 있는지, 그리고 와일드한 널 포인터에 부딪히지 않도록 따라야 할 몇 가지 모범 사례를 살펴봅니다. 더 이상 고민하지 않고 시작하겠습니다.

java.lang.NullPointerException이란 무엇입니까?

Null 포인터 예외는 Java 언어에서 지원하는 여러 예외 중 하나입니다. 이것은 현재 null을 가리키는 참조 변수에 액세스하려고 시도했음을 나타냅니다.

Null은 선언 이후 또는 선언과 함께 사용자가 초기화하지 않은 변수에 할당된 Java의 기본값입니다. 다음과 같이 변수를 선언하는 다음 예를 고려하십시오.

String str;

그런 다음 변수의 내용을 인쇄해 보십시오.

System.out.println(str);
// => null

위에서 볼 수 있듯이 'null'이 출력에 인쇄됩니다. 이것은 변수 str이 초기화되지 않았기 때문에 현재 null 값을 가리키거나 보유하고 있음을 보여줍니다. 널 포인팅 변수가 제기하는 문제는 변수가 참조일 뿐 아무 것도 가리키지 않는다는 것입니다. 널 포인팅 변수에 저장된 데이터에 대해 일부 작업을 수행하려고 하면 시스템이 무엇을 해야 할지 모릅니다. 이것은 변수에 실제로 저장된 데이터가 없기 때문에 발생합니다. 무효 엔티티를 가리킵니다.

java.lang.NullPointer.Exception의 예

java.lang.NullPointerException의 예를 찾는 것은 어려운 작업이 아닙니다. 액세스를 시도하기 전에 변수를 초기화하지 않기만 하면 되기 때문입니다. 예를 들어 StringBuilder 클래스를 고려해 보겠습니다. StringBuilder는 문자열의 형성 및 조작을 처리하는 데 사용되는 클래스입니다. 일반적으로 클래스를 사용하여 문자열을 만드는 방법은 다음과 같습니다.

import java.util.StringBuilder;

public class Test {
  public static void main(String[] args) {
    StringBuilder sb = new StringBuilder();

    sb.append("Hello ");
    sb.append("World!");
   
    String result = sb.toString();

    System.out.println(result);
    // => Hello World!
  }
}

위의 스니펫을 실행하면 정상적으로 작동합니다. null 포인터 예외를 발생시키는 수정된 버전을 살펴보겠습니다.

참가자의 81%는 부트캠프에 참석한 후 기술 직업 전망에 대해 더 자신감을 느꼈다고 말했습니다. 지금 부트캠프에 참여하십시오.

부트캠프 졸업생은 부트캠프 시작부터 첫 직장을 찾는 데까지 6개월도 채 걸리지 않았습니다.

import java.util.StringBuilder;

public class Test {
  public static void main(String[] args) {
    StringBuilder sb;

    sb.append("Hello ");
    sb.append("World!");
   
    String result = sb.toString();

    System.out.println(result);
  }
}

보시다시피 선언하는 동안 StringBuilder 클래스의 인스턴스를 초기화하지 않았습니다. sb.append() 행이 실행되면 sb는 실제로 어떤 객체도 가리키지 않고 오히려 null을 가리킵니다. 여기에서 NullPointerException이 발생합니다. 예외가 발생했기 때문에 JVM은 이후에 어떤 명령문도 실행할 수 없습니다.

java.lang.NullPointerException 오류 수정 방법

Null 포인터 예외를 만드는 것은 쉽지만 피하거나 수정하는 것은 까다롭습니다. 일부 통합 개발 환경(IDE)은 호환 가능한 값으로 변수를 초기화하기 전에 변수에 액세스하는 경우 경고하지만 대부분의 IDE는 여러 메서드 호출을 통해 변수를 전달할 때와 같은 복잡한 상황에서 이를 알아낼 수 없습니다. Null 포인터 예외에 대한 정확한 수정은 상황과 코드에 따라 다릅니다. 다음은 일반적인 Null 포인터 시나리오를 수정하는 몇 가지 주요 방법입니다.

코드에 수동 오류가 있는지 확인

Null Pointer Exception이 발생하는 가장 큰 이유는 인적 오류입니다. 작성한 프로그램이 처음에 의도한 올바른 논리를 전달하는지 확인하십시오. 또한 소스 코드를 살펴보고 누락된 문장이 있는지 또는 일부 변수에 값이 할당되지 않은 변수의 철자가 잘못되었는지 확인하십시오.

논리가 지시하는 대로 코드를 작성했는지 확인하고 명령문 작성을 놓치거나 잘못된 참조에 개체를 할당하지 않았는지 확인하십시오. 일반적으로 변수를 사용하기 전에 객체로 초기화하는지 확인하십시오.

Null 포인터 예외를 유발할 수 있는 코드 주위에 안전 검사를 실시합니다.

NullPointer의 원인이 되는 코드 행을 알고 있고 논리도 정확하다고 생각하는 경우 코드 섹션을 try-catch 블록으로 래핑하고 Null 포인터가 포착될 때의 동작을 정의할 수 있습니다. 이러한 설정은 다음과 같습니다.

...
// Some code above

try {
  // Put the exception-prone code here
} catch (NullPointerException npe) {
  // Define what needs to be done when an NPE is caught
}

// Some code below
...

이것은 특정 참조 변수가 null을 포함하거나 포함하지 않을 수 있는 상황에서 발생합니다. 종종 원격 API 응답, 장치 인터페이스 응답이 이 시나리오에 취약합니다. 결과 또는 하드웨어의 가용성에 따라 응답 변수는 인스턴스화된 개체를 가리킬 수도 있고 가리지 않을 수도 있습니다. 안전 점검을 사용하는 것이 이러한 상황을 처리하는 데 가장 적합합니다.

액세스하기 전에 Null 확인

이 방법은 try-catch 방법과 유사합니다. 이 방법에서 'if' 블록은 변수에 액세스하기 전에 null 값을 확인하는 데 사용됩니다. 다음은 'if' 블록을 사용하여 오류를 포착하는 경우 코드의 이전 스니펫이 어떻게 보이는지 보여줍니다.

...
// Some code above

If (myVar !== null ) {
  // Put the success logic here
} else {
  // Handle null value here
}

// Some code below
...

두 방법의 가장 큰 차이점은 수행하는 검사의 범위입니다. if 메서드는 myVar 변수에서 null 값만 확인하는 반면 try-catch 블록은 null인 모든 변수를 포착합니다.

이렇게 하면 'if' 블록이 애플리케이션 로직에서 널 포인터를 수용하기 위한 좀 더 표적화되고 깔끔한 접근 방식이 됩니다. 그러나 null일 수 있는 변수가 두 개 이상 있는 경우 단순성을 위해 try-catch 블록을 사용하는 것이 좋습니다.

결론

이 기사에서는 Java에서 Null 포인터 예외가 무엇이며 이 오류가 어떻게 발생하는지 살펴보았습니다. 또한 실제 상황에서 Null 포인터가 생성되는 방식을 이해하기 위해 Null 포인터 예외를 발생시키는 코드를 살펴보았습니다. 마지막으로 Null 포인터 예외를 수정하는 몇 가지 주요 방법을 확인하고 NPE를 수정하는 두 가지 방법을 대조하여 논의를 마쳤습니다.

Java 프로그램을 작성하려는 경우 Null 포인터 예외는 수정 방법을 알아야 하는 필수 버그 중 하나입니다. 이 예외는 가장 자주 발생하는 문제 중 하나이며 코드의 구문이나 의미와 관련이 없습니다. 이것은 예외를 식별하고 수정하기 가장 까다로운 문제 중 하나로 만듭니다. 이 문서와 같은 문제를 해결하기 위한 빠른 참조는 귀하의 경험을 더욱 원활하게 만들어 줄 것입니다.