>  Q&A  >  본문

NullPointerException은 무엇이고 어떻게 해결하나요?

<p>널 포인터 예외(<code>java.lang.NullPointerException</code>)는 무엇이며 그 원인은 무엇입니까? </p> <p>예외로 인해 프로그램이 조기 종료되는 것을 방지할 수 있도록 원인을 파악하기 위해 어떤 방법/도구를 사용할 수 있습니까? </p>
P粉649990273P粉649990273393일 전547

모든 응답(2)나는 대답할 것이다

  • P粉252116587

    P粉2521165872023-08-24 09:14:35

    NullPointerException 是当您尝试使用指向内存中任何位置 (null) 的引用时发生的异常,就像引用对象一样。对空引用调用方法或尝试访问空引用的字段将触发 NullPointerException。这些是最常见的,但 中列出了其他方法NullPointerException javadoc 페이지.

    NullPointerException을 설명하기 위해 제가 생각할 수 있는 가장 빠른 예제 코드는 아마도 다음과 같습니다.

    으아아아

    main 内的第一行,我显式地将 Object 引用 obj 设置为 null 。这意味着我有一个引用,但它没有指向任何对象。之后,我尝试通过调用该引用的方法来将该引用视为指向一个对象。这会导致 NullPointerException 참조가 가리키는 위치에 실행할 코드가 없기 때문입니다.

    (이것은 기술적인 질문이지만 언급할 가치가 있다고 생각합니다. null에 대한 참조는 잘못된 메모리 위치를 가리키는 C 포인터와 동일하지 않습니다. null 포인터는 실제로 아무 곳이나 가리키지 않습니다. 이는 동일합니다. 잘못된 위치를 가리키는 것과 같은 미묘한 차이 )

    회신하다
    0
  • P粉593536104

    P粉5935361042023-08-24 00:10:48

    Java에는 두 가지 주요 유형의 변수가 있습니다.

    1. Primitives: 데이터가 포함된 변수입니다. 원래 변수의 데이터를 조작하려면 변수를 직접 조작하면 됩니다. 관례적으로 기본 유형은 소문자로 시작합니다. 예를 들어 intchar 유형의 변수는 기본 요소입니다.

    2. Reference: Object의 메모리 주소가 포함된 변수, 즉 对象内存地址的变量,即引用对象的变量代码>.如果您想要操作引用变量引用的Object,则必须取消引用它。取消引用通常需要使用 . 访问方法或字段,或使用 [ 索引数组。按照惯例,引用类型通常用以大写字母开头的类型来表示。例如,ObjectObject

      code>를
    3. 참조하는 변수입니다. >참조 변수 code>에서 참조하는 개체를
    역참조

    해야 합니다. 역참조하려면 일반적으로 .를 사용하여 메서드나 필드에 액세스하거나 [를 사용하여 배열을 인덱싱해야 합니다. 관례적으로 참조 유형은 일반적으로 대문자로 시작하는 유형으로 표시됩니다. 예를 들어 Object 유형의 변수는 참조입니다. int

    유형

    x 指定任何值,而我们正在尝试使用 x 的值来指定 yraw

    변수를 선언하지만 초기화하지 않는 다음 코드를 고려하세요.

    으아악 이 두 줄은 >이 없기 때문에 프로그램을 중단시킵니다. 모든 프리미티브는 조작되기 전에 사용 가능한 값으로 초기화되어야 합니다. null,这意味着“我没有引用任何东西”。如果您以这种方式显式设置引用变量,则可以在引用变量中获取 null 值,或者引用变量未初始化并且编译器不会捕获它(Java 会自动将该变量设置为 null

    이제 상황이 흥미로워집니다.

    References변수는 null로 설정할 수 있습니다. 이는 "아무것도 참조하지 않습니다 "를 의미합니다. 이런 방식으로 참조 변수를 명시적으로 설정하면 참조 변수에서 null 값을 얻을 수 있거나, 참조 변수가 초기화되지 않아 컴파일러가 이를 포착하지 못합니다(Java가 자동으로 변수를 설정함). null로). NullPointerException

    Java를 통해 명시적으로 또는 자동으로 참조 변수를 null로 설정하고 이를

    역참조 NullPointerException하려고 하면

    가 표시됩니다.

    일반적으로 변수를 선언했지만 변수의 내용을 사용하기 전에 개체를 생성하여 변수에 할당하지 않을 때 발생합니다

    (NPE). 그래서 실제로 존재하지 않는 것을 언급하고 있는 것입니다. num的变量,但它实际上还不包含引用值。由于您还没有说出要指向什么,Java 将其设置为 null

    다음 코드를 사용하세요:

    으아악 new关键字用于实例化(或创建)一个Integer类型的对象,引用变量num 被分配给该 Integer첫 번째 줄은

    라는 파일을 선언합니다.

    num,您将得到一个NullPointerException。在最简单的情况下,编译器会捕获问题并让您知道“num 可能尚未初始化두 번째 줄,

    개체.

    객체를 생성하기 전에 num을 역참조하려고 하면

    obj,而是假设它是在调用 doSomething()

    가 표시됩니다. 가장 간단한 경우, 컴파일러는 문제를 파악하고 "num이 초기화되지 않았을 수 있습니다"라고 알려 주지만 때로는 개체를 직접 생성하지 않는 코드를 작성할 수도 있습니다. 🎜 🎜예를 들어 다음과 같은 방법이 있을 수 있습니다. 🎜 으아악 🎜이 경우 🎜 메서드 이전에 생성된 개체를 생성하지 않습니다. 메소드는 다음과 같이 호출될 수 있습니다. 🎜으아악

    이 경우에는 objnull,并且语句 obj.myMethod() 将抛出 NullPointerException >.

    메서드가 위의 메서드처럼 전달된 개체에 대해 일부 작업을 수행하려는 경우 NullPointerException를 던지는 것이 적절합니다. 이는 프로그래머 오류이고 프로그래머는 디버깅 목적으로 해당 정보가 필요하기 때문입니다.

    메서드 로직으로 인해 발생한 NullPointerException 异常之外,您还可以检查方法参数中的 null 예외 외에도, 메서드 매개변수의

    값을 확인하고 다음과 같은 항목을 추가하여 명시적으로 NPE를 던질 수도 있습니다. 메서드 시작 부분 근처에 다음:

    으아악 오류 메시지에 어떤 null객체가

    될 수 없는지 명시적으로 명시하는 것이 도움이 될 것입니다. 이를 검증하면 1) 더 명확한 오류 메시지를 반환할 수 있고, 2) 나머지 메서드에 대해 obj가 null이 아니며 재할당되지 않는 한 안전하게 역참조될 수 있다는 점입니다.

    또는 어떤 경우에는 메서드의 목적이 전달된 개체에 대해 작업을 수행하는 것만이 아니므로 빈 매개 변수가 허용될 수 있습니다. 이 경우 null 매개변수를 확인하고 다르게 동작해야 합니다. 문서에서도 이에 대해 설명해야 합니다. 예를 들어 doSomething()는 다음과 같이 쓸 수 있습니다.

    으아악

    마지막으로 스택 추적을 사용하여 예외 및 원인을 찾아내는 방법

    버그 발견 기능을 갖춘 수중 음파 탐지기는 NPE를 감지할 수 있습니다. 소나는 JVM으로 인한 널 포인터 예외를 동적으로 캡처할 수 있습니다

    이제 Java 14에는 NullPointerException의 근본 원인을 보여주는 새로운 언어 기능이 추가되었습니다. 이 언어 기능은 2006년부터 SAP Business JVM의 일부였습니다.

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

    NullPointerException 일을 일으키는 상황 목록

    다음은 Java 언어 사양에서 언급한 대로 NullPointerException가 직접* 발생하는 모든 상황입니다.

    • 널 참조의 인스턴스 필드에 액세스(예: 가져오기 또는 설정)합니다. (정적 필드는 포함되지 않습니다!)
    • 널 참조의 instance메서드를 호출합니다. (정적 메소드는 포함되지 않습니다!)
    • 抛出空值;
    • 빈 배열의 요소에 액세스합니다.
    • Null에 동기화 - synchronized (someNullReference) { ... }
    • 모든 정수/부동 소수점 연산자는 피연산자 중 하나가 박싱된 Null 참조인 경우 오류를 발생시킬 수 있습니다. NullPointerException
    • boxed 값이 null이면 unboxing 변환이 NullPointerException 증가합니다.
    • 널 참조에 대해 super를 호출하면 super 会引发 NullPointerException가 발생합니다. 혼란스럽다면 이는 정규화된 슈퍼클래스 생성자 호출에 관한 것입니다.
    으아악
    • 빈 컬렉션/배열을 반복하려면 for (element : iterable) 루프를 사용하세요.

    • switch (foo) { ... }(无论是表达式还是语句)在 foo 时可以抛出 NullPointerException 비어 있습니다.

    • foo.new SomeInnerClass()foo 为 null 时抛出 NullPointerException.

    • name1::name2primaryExpression::name 形式的方法引用在以下情况下求值时会抛出 NullPointerException name1 或 primaryExpression는 null로 평가됩니다.

      JLS의 메모에 따르면 someInstance.someStaticMethod() 不会抛出 NPE,因为 someStaticMethod 是静态的,但 someInstance:: someStaticMethod여전히 NPE가 발생합니다!

    * JLS는 NPE에 대해 간접적으로 이야기할 수도 있다는 점에 유의하세요.

    회신하다
    0
  • 취소회신하다