programing

Null Pointer란예외입니다. 어떻게 수정 방법

firstcheck 2022. 7. 3. 19:52
반응형

Null Pointer란예외입니다. 어떻게 수정 방법

포인터의( 「」)java.lang.NullPointerException그리고 의인인 엇엇? ???

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

참조 변수(즉, 개체)를 선언하면 개체에 대한 포인터를 실제로 만드는 것입니다.합니다.int:

int x;
x = 10;

예에서는 " " " " 가 사용됩니다.x는 입니다.int합니다.0 、 을 、 of 、 of 、 of 、 the 、 、 the the the the the the the10 의 값 " " " "10에 의해 참조되는 메모리 위치에 써집니다.x.

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

Integer num;
num = new Integer(10);

은 변수 인 '보다'를 선언합니다.num그러나 실제로는 아직 초기값이 포함되어 있지 않습니다.대신 포인터가 포함되어 있습니다(유형은Integer참조 타입입니다). 않았기 을 Java로 합니다.null즉, "나는 아무것가리키지 않는다"는 뜻입니다.

줄에는 '''가 .new는 타입의 작성 위해 합니다.Integer 및 변수 " " " " 입니다.num되어 있습니다.Integer★★★★★★ 。

NullPointerException(NPE)는 변수를 선언했지만 개체를 생성하여 변수에 할당하지 않은 후 변수의 내용(비참조라고 함)을 사용하려고 할 때 발생합니다.그래서 당신은 실제로 존재하지 않는 것을 가리키고 있다.

'역참조하다'를 할 때 합니다.. 또는 를 사용합니다.[인덱스를 지정합니다.

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);

경우, 「」는 「」입니다.objnull및 「」라고 하는 스테이트먼트.obj.myMethod()NullPointerException.

된 오브젝트에 대해 , 이 메서드를 .NullPointerException왜냐하면 프로그래머 오류이기 때문에 프로그래머는 디버깅을 위해 그 정보가 필요하기 때문입니다.

★★★★★★★★★★★★★★★★ NullPointerException로서 던져진s는, 「S」의 할 수도 있습니다.nullNPE를 사용하다메서드의 선두 부근에 다음과 같은 것을 추가합니다.

// Throws an NPE with a custom error message if obj is null
Objects.requireNonNull(obj, "obj must not be null");

에러 메세지에, 어느 오브젝트를 지정할 수 없는지를 명확하게 하는 것이 도움이 됩니다.null1) 할 수 2)은 1) 명확한 에러 메시지를 할 수 있다는 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
    }
}

마지막으로 스택 트레이스를 사용하여 예외와 원인을 특정하는 방법

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

검출 버그가 있는 음파 탐지기는 NPE를 검출할 수 있습니다.JVM에 의해 동적으로 발생하는 늘 포인터 예외를 소나에서 포착할 수 있습니까?

이제 Java 14는 Null Pointer의 근본 원인을 보여주는 새로운 언어 기능을 추가했습니다.예외.이 언어 기능은 2006년부터 SAP 상용 JVM에 포함되어 있습니다.

Java 14에서는 Null Pointer의 예를 다음에 나타냅니다.예외 예외 메시지:

scread "main" java.scread에 있습니다.특수한 포인터예외: "java.util"을 호출할 수 없습니다."list"가 null이기 때문에 list.size()가 됩니다.

NullPointerException는, 메모리(메모리)내의 어느 장소도 가리키지 않는 참조를 오브젝트를 참조하고 있는 것처럼 사용하려고 했을 경우에 발생하는 예외입니다.늘.NullPointerException가장 일반적인 방법이지만 다른 방법은 javadoc 페이지에 나와 있습니다.

내가 생각할 수 가장 일 것이다.NullPointerException음음음같 뭇매하다

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

에 첫 mainObjectobj에 equal null참조는 있지만 개체를 가리키지는 않습니다.그 후, 나는 그 참조를 메서드를 호출함으로써 그 오브젝트를 가리키는 것처럼 메서드를 호출한다., 「」가 .NullPointerException참조가 가리키는 위치에 실행할 코드가 없기 때문입니다.

(이것은 기술적인 문제이지만, null을 가리키는 참조는 유효하지 않은 메모리 위치를 가리키는 C 포인터와 같지 않습니다.늘 포인터는 문자 그대로 아무 곳이나 가리키는 것이 아닙니다.이것은, 무효인 장소를 가리키는 것과는 미묘하게 다릅니다).

Null Pointer란예외?

우선 JavaDocs부터 시작하는 것이 좋습니다.이 내용은 다음과 같습니다.

개체가 필요한 경우 응용 프로그램이 null을 사용하려고 할 때 느려집니다.여기에는 다음이 포함됩니다.

  • Null 객체의 인스턴스 메서드를 호출합니다.
  • null 객체의 필드 액세스 또는 변경.
  • null의 길이를 배열로 간주합니다.
  • null 슬롯에 액세스하거나 어레이인 것처럼 변경합니다.
  • 던질 수 있는 값인 것처럼 null을 던집니다.

응용 프로그램은 null 객체의 다른 잘못된 사용을 나타내기 위해 이 클래스의 인스턴스를 던져야 합니다.

null 참조를 null로 할 null 를 null로 사용할 수 있습니다.synchronizedJLS별로 다음 예외도 발생합니다.

SynchronizedStatement:
    synchronized ( Expression ) Block
  • 이외의 경우 null일 Expression null이 .NullPointerException집니니다

어떻게 고치죠?

당신은...NullPointerException★★★★★★★★★★★★★★★★★? 간단한 예를 들면, '어느 정도', '어느 정도', '어느 정도' ' 정도?'NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

null 값을 식별합니다.

첫 번째 단계에서는 예외가 발생하고 있는 값을 정확하게 특정합니다.그러기 위해서는 디버깅을 해야 합니다.스택 트레이스를 읽는 법을 배우는 것은 중요합니다.예외가 발생한 위치가 표시됩니다.

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

13행」에서)에 있는 알 수 .printString메서드).행을 보고 로깅 문을 추가하거나 디버거를 사용하여 null인 값을 확인합니다.우리는 그것을 알게 되었습니다.s이며, null 을 합니다.length방법을 알 수 .s.length()메서드에서 삭제됩니다.

이러한 값의 출처를 추적합니다.

을 하다, 「」를 알 수 있습니다.sprintString(name) print()및 "disclosed" 입니다.this.namemanageda 입니다.

값을 설정해야 하는 위치 추적

「 」는 어디에 ?this.name 팅?에?setName(String)방법.디버깅을 좀 더 하면 이 메서드가 전혀 호출되지 않음을 알 수 있습니다.메서드가 호출된 경우 이러한 메서드가 호출된 순서를 확인하고 인쇄 메서드 뒤에 설정된 메서드가 호출되지 않았는지 확인하십시오.

알 수 을 에 추가해 주세요.문의처 추가printer.setName()를 호출하기 printer.print().

기타 수정 사항

변수는 기본값을 가질 수 있습니다.setName 수 : null null로 설정되는 것을 방지할 수 있습니다.

private String name = "";

" " " " " " " "print ★★★★★★★★★★★★★★★★★」printString메서드는 null을 확인할 수 있습니다.다음은 예를 제시하겠습니다.

printString((name == null) ? "" : name);

'가 '클래스'를 디자인할 .name 에는 항상 비표준 값이 있습니다.

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

다음 항목도 참조하십시오.

아직 문제를 찾을 수 없다

문제를 디버깅하려고 했는데도 해결 방법이 없는 경우 질문을 게시하여 도움을 받을 수 있지만 지금까지 시도한 내용을 반드시 포함하십시오.적어도 질문에 스택 트레이스를 포함하여 코드에 중요한 행 번호를 표시합니다.또, 우선 코드를 간략화해 주세요(SSCCE 참조).

what : 의 의 원인NullPointerException (NPE)?

아시다시피 Java 타입은 원시 타입으로 나뉩니다.boolean,int, 등) 및 참조 유형.Java 참조 유형을 사용하면 특수 값을 사용할 수 있습니다.null목적 없음

A NullPointerException하려고 할 .null과 같이쓰면 과 같습니다를를들,, 음음음음음음음음 음음음음음음

public class Test {
    public static void main(String[] args) {
        String foo = null;
        int length = foo.length();   // HERE
    }
}

「HERE하는 라벨이 붙은 는, 「HERE」를 .length()null참조할 수 있습니다.★★★★★★★★★★★★★★★★,NullPointerException.

가지 할 수 .null「」가 값.NullPointerException사실, 당신이 할 수 있는 유일한 것은nullNPE의 경우, NPE를 사용하다

  • 참조 변수에 할당하거나 참조 변수에서 읽습니다.
  • 어레이 요소에 할당하거나 어레이 요소에서 읽습니다(어레이 참조 자체가 중복되지 않은 경우).
  • 매개 변수로 전달하거나 결과로 반환하거나, 또는
  • 해 보다== ★★★★★★★★★★★★★★★★★」!=operators, 「」를 해 주세요.instanceof.

질문:.NPE 스택트레이스를 읽으려면 어떻게 해야 하나요?

위의 프로그램을 컴파일하여 실행한다고 가정합니다.

$ javac Test.java 
$ java Test
Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:4)
$

첫 번째 관찰: 컴파일 성공!프로그램의 문제는 컴파일 오류가 아닙니다.런타임 오류입니다. (일부 IDE는 프로그램에서 항상 예외가 발생한다고 경고할 수 있습니다... 그러나 표준javac컴파일러는 그렇지 않습니다.)

두 번째 관찰: 프로그램을 실행하면 두 줄의 "gobbledy-gook"이 출력됩니다.땡!그건 구블리가 아니야.스택 트레이스입니다.또, 시간을 들여 신중하게 읽어내면, 코드의 에러를 추적하는데 도움이 되는 중요한 정보를 제공합니다.

자, 그럼 이렇게 써있네요.

Exception in thread "main" java.lang.NullPointerException

스택 트레이스의 첫 번째 행은 다음과 같은 많은 것을 나타냅니다.

  • 예외가 발생한 Java 스레드의 이름을 알려줍니다.스레드가 1개 있는 단순한 프로그램의 경우(이러한 프로그램)는, 「메인」이 됩니다.다음으로 넘어갑시다...
  • 여기에는 발생한 예외의 전체 이름이 표시됩니다. java.lang.NullPointerException.
  • 예외에 관련된 오류 메시지가 있는 경우 예외 이름 뒤에 출력됩니다. NullPointerException에러 메세지가 거의 표시되지 않기 때문에, 이 점에서는 이례적입니다.

두 번째 행은 NPE 진단에서 가장 중요한 행입니다.

at Test.main(Test.java:4)

이것은 많은 것을 말해줍니다.

  • Test가 "at Test.main"에 .main의 of의 Test를 누릅니다
  • "Test.java:4"는 클래스의 소스 파일 이름을 제공하며, 이것이 발생한 문이 파일의 4행에 있음을 알려줍니다.

위의 파일의 행을 세어 보면, 4번째 행은 제가 "HERE" 코멘트로 라벨을 붙인 것입니다.

보다 복잡한 예에서는, NPE 스택트레이스에는 다수의 회선이 존재하는 것에 주의해 주세요.단, 두 번째 행(첫 번째 "at" 행)은 NPE가 던져진1 위치를 알려줍니다.

즉, 스택 트레이스는 프로그램의 어떤 스테이트먼트가 NPE를 슬로우했는지를 명확하게 알려줍니다.

다음 항목도 참조하십시오.스택 트레이스란 무엇입니까?어플리케이션오류를 디버깅하려면 어떻게 해야 하나요?

1 - 그렇지 않습니다.중첩된 예외라는 것이 있습니다.

질문:.코드로 NPE 예외의 원인을 추적하려면 어떻게 해야 합니까?

이게 어려운 부분이에요.간단히 말하면 스택 트레이스, 소스 코드 및 관련 API 문서에 의해 제공되는 증거에 논리적 추론을 적용하는 것입니다.

먼저 간단한 예시로 설명하겠습니다.먼저 스택 트레이스가 NPE가 발생한 장소를 나타내는 행을 확인합니다.

int length = foo.length(); // HERE

어떻게 NPE를 던질 수 있지?

한 은 오직 한 가지입니다.그것은, 「이러다」: 「이러다」가 있는 입니다.foonull '보다', '보다', '보다'를 실행해 length()의 메서드입니다.null 빵! 빵!

보니)가 NPE 안에 던져져 요?length()★★★★★★★★★★★★★★★★?

" 가 "at" 행의 어떤 말할있습니다java.lang.String 및 4행Test.java두 번째 "at" 라인이 될 것입니다.

그건 서 났지?null★★★★★★★★★★★★★★★★★? ('이 아닌 값을 'Null'로 합니다.)foo

그럼 조금 더 까다로운 예를 들어 보겠습니다.여기에는 논리적인 추론이 필요합니다.

public class Test {

    private static String[] foo = new String[2];

    private static int test(String[] bar, int pos) {
        return bar[pos].length();
    }

    public static void main(String[] args) {
        int length = test(foo, 1);
    }
}

$ javac Test.java 
$ java Test
Exception in thread "main" java.lang.NullPointerException
    at Test.test(Test.java:6)
    at Test.main(Test.java:10)
$ 

이제 두 개의 "at" 라인이 있습니다.첫 번째는 이 행에 대한 것입니다.

return args[pos].length();

두 번째는 이 줄에 대한 것입니다.

int length = test(foo, 1);
    

첫 줄을 보면 어떻게 NPE를 던질 수 있지?두 가지 방법이 있습니다.

  • 「」의 barnullbar[pos]NPE를 사용하다
  • 「」의 bar[pos]null 불러주세요length()NPE를 사용하다

다음으로 실제로 무슨 일이 일어나고 있는지를 설명하는 시나리오가 무엇인지 알아내야 합니다.첫 번째 항목부터 살펴보겠습니다.

'어디서양속담,은요?bar★★★★★★★★★★★★★★★★★?는 이 입니다.test 콜,및 「Method Call」의 「Method Call」의 「Method Call」의 「Method Call」의 「Method Call」을 참조해 주세요.test "Diagnostics" 에서 발신된 을 알 수.foo외에도 우리가 초기화했다는 을 알 수.foo비표준값으로 변환합니다.그것은 이 설명을 잠정적으로 무시하기에 충분하다.(이론적으로, 다른 무언가가 바뀔 수 있습니다. foo로로 합니다.null 여기서 그런 .)하지만 여기서 그런 일은 일어나지 않는다.)

럼럼두 ?나 ?? ???? 이렇게 보면 '아, 이렇게 볼 수 요.pos1 ②,foo[1]야 한다.null게가 ??

정말 그렇다!그리고 그것이 문제다.다음과 같이 초기화할 경우:

private static String[] foo = new String[2];

를 a a a String[]초기화된 2개의 요소를 포함합니다.그 후, 우리는 그 내용을 변경하지 않았습니다.foo...그렇게foo[1] 남아 있다null.

Android에서는 어떻습니까?

Android에서는 NPE의 직접적인 원인을 추적하는 것이 조금 더 간단합니다.예외 메시지는 일반적으로 사용하고 있는 늘 참조의 (컴파일 시간)유형 및 NPE가 느려졌을 때 호출하려고 했던 메서드를 나타냅니다.이로 인해 직접적인 원인을 찾는 프로세스가 간소화됩니다.

한편, Android는 NPE에 공통적인 플랫폼 고유의 원인을 가지고 있습니다.매우 일반적인 것은getViewById null치 않은 Q&A의 Q 것이 null반환값

'을 것 요.null하다

TypeA objA;

현재 이 개체를 선언했을 뿐 초기화 또는 인스턴스화되지 않았습니다.그리고 당신이 그 안에 있는 어떤 속성이나 메서드에 접근하려고 할 때마다, 그것은 던질 것입니다.NullPointerException말이 되네

다음의 예도 참조해 주세요.

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown

개체가 필요한 경우 응용 프로그램이 null을 사용하려고 하면 null 포인터 예외가 느려집니다.여기에는 다음이 포함됩니다.

  1. of of of of of of of of of of 의 인스턴스 메서드를 합니다.null★★★★★★ 。
  2. 접근 null★★★★★★ 。
  3. 의 길이null치치배배배배배배
  4. 의 에 대한 액세스 null치치배배배배배배
  5. null치치 、 버는는는치치 치치요 。

프로그램에서는 이 클래스의 .null★★★★★★ 。

참고 자료: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

A null포인터는 아무 데도 가리키지 않는 것입니다.를 했을 때p에 되어 있는 를 주세요.p'에 저장되어 있는 위치에 데이터를 p는 입니다.null " "에되어 있는 위치"pnowhere '데이터를 주세요.', '데이터를 주세요.', '데이터를 주세요.', '데이터를 주세요.할 수 없기 에, 「 」 「 」 「 」 「 」 「 」 「 」 「 」null pointer exception.

일반적으로는 초기화되지 않았기 때문입니다.

이 문제의 발생 원리와 해결 방법을 설명하기 위해 이미 많은 설명이 제공되고 있지만, 를 피하기 위해 베스트 프랙티스에 따라야 합니다.

다음 항목도 참조하십시오.베스트 프랙티스의 좋은 것

한 것은, 「아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,final수식어Java에서 적용 가능한 경우 항상 "최종" 수식자 사용

요약:.

  1. 하다를 사용하세요.final적절한 초기화를 강제하는 수식자.
  2. 메서드에서 null을 반환하지 마십시오(예: 해당하는 경우 빈 컬렉션을 반환).
  3. 주석 사용 및
  4. fail fast 및 assert를 사용하여 null 객체가 null이 되어서는 안 되는 경우 애플리케이션 전체에 null 객체가 전파되지 않도록 합니다.
  5. use " " " " " " " 。if("knownObject".equals(unknownObject)
  6. valueOf()에 걸쳐서toString().
  7. null safe 메서드 사용StringUtils.isEmpty(null).
  8. 메서드에서 Java 8 Optional을 반환값으로 사용합니다.Optional 클래스는 늘 참조 대신 옵션 값을 나타내는 솔루션을 제공합니다.

늘 포인터 예외는 개체를 초기화하지 않고 사용 중임을 나타냅니다.

예를 들어, 아래는 코드에 사용할 학생 수업입니다.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

다음 코드는 Null 포인터 예외를 제공합니다.

public class School {

    Student student;

    public School() {
        try {
            student.getId();
        }
        catch(Exception e) {
            System.out.println("Null pointer exception");
        }
    }
}

용용 because because because because because because because 를 사용하고 있기 student다음 올바른 코드와 같이 초기화하지 않았습니다.

public class School {

    Student student;

    public School() {
        try {
            student = new Student();
            student.setId(12);
            student.getId();
        }
        catch(Exception e) {
            System.out.println("Null pointer exception");
        }
    }
}

Java에서는 모든 것(원시형 제외)이 클래스 형식입니다.

오브젝트를 사용하는 경우는, 다음의 2개의 단계가 있습니다.

  1. 선언하다
  2. 초기화

예:

  • 언::Object object;
  • 기화::object = new Object();

어레이의 개념도 동일합니다.

  • 언::Item item[] = new Item[5];
  • 기화::item[0] = new Item();

하지 않을 " " " " " 를 하십시오.NullPointerException

Java에서 선언하는 모든 변수는 실제로 개체(또는 원시)에 대한 "참조"이며 개체 자체가 아닙니다.

하나의 객체 메서드를 실행하려고 하면 참조는 활성 객체에 해당 메서드를 실행하도록 요청합니다.단, 참조가 NULL(nothing, 0, void, nada)을 참조하고 있는 경우 메서드는 실행되지 않습니다.그러면 런타임에서 Null Pointer를 던져 이 사실을 알립니다.예외.

참조가 null을 가리키고 있으므로 "Null -> Pointer"가 됩니다.

은 VM을 사용하는 입니다.this 예를 .하다

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

그리고 코드의 다른 위치:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

입니다. - 오브젝트에 때(의 예에서는, 「이러다」, 「이러다」)입니다.reference ★★★★★★★★★★★★★★★★★」otherReference둘 다 null을 가리키면 개체가 "도달할 수 없음" 상태가 됩니다.이 개체로 작업할 수 없으므로 이 개체를 가비지 수집 준비가 되어 있으며, 어느 시점에서는 VM이 이 개체에서 사용하는 메모리를 해방하고 다른 개체를 할당합니다.

다른 NullPointerException오브젝트 배열을 선언한 후 오브젝트 배열 내의 요소를 즉시 참조 해제하려고 할 때 발생합니다.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

특정 는 비교 가 반대로 있으면 할 수 「NPE」를 사용합니다..equals츠키노

어레이 내의 모든 요소는 공통 초기값으로 초기화됩니다.즉, 객체 어레이의 모든 유형에 대해 모든 요소는 다음과 같습니다.null.

요소에 액세스하거나 참조 해제하기 전에 배열의 요소를 초기화해야 합니다.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

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

반응형