P粉2521165872023-08-24 09:14:35
NullPointerException
是当您尝试使用指向内存中任何位置 (null) 的引用时发生的异常,就像引用对象一样。对空引用调用方法或尝试访问空引用的字段将触发 NullPointerException
。这些是最常见的,但 中列出了其他方法NullPointerException
javadoc 페이지.
NullPointerException을 설명하기 위해 제가 생각할 수 있는 가장 빠른 예제 코드는 아마도 다음과 같습니다.
으아아아 main
内的第一行,我显式地将 Object
引用 obj
设置为 null
。这意味着我有一个引用,但它没有指向任何对象。之后,我尝试通过调用该引用的方法来将该引用视为指向一个对象。这会导致 NullPointerException
참조가 가리키는 위치에 실행할 코드가 없기 때문입니다.
(이것은 기술적인 질문이지만 언급할 가치가 있다고 생각합니다. null에 대한 참조는 잘못된 메모리 위치를 가리키는 C 포인터와 동일하지 않습니다. null 포인터는 실제로 아무 곳이나 가리키지 않습니다. 이는 동일합니다. 잘못된 위치를 가리키는 것과 같은 미묘한 차이 )
P粉5935361042023-08-24 00:10:48
Java에는 두 가지 주요 유형의 변수가 있습니다.
Primitives: 데이터가 포함된 변수입니다. 원래 변수의 데이터를 조작하려면 변수를 직접 조작하면 됩니다. 관례적으로 기본 유형은 소문자로 시작합니다. 예를 들어 int
或 char
유형의 변수는 기본 요소입니다.
Reference: Object
의 메모리 주소가 포함된 변수, 즉 对象
内存地址的变量,即引用对象的变量代码>.如果您想要操作引用变量引用的Object
,则必须取消引用它。取消引用通常需要使用 .
访问方法或字段,或使用 [
索引数组。按照惯例,引用类型通常用以大写字母开头的类型来表示。例如,Object
Object
해야 합니다. 역참조하려면 일반적으로 .
를 사용하여 메서드나 필드에 액세스하거나 [
를 사용하여 배열을 인덱싱해야 합니다. 관례적으로 참조 유형은 일반적으로 대문자로 시작하는 유형으로 표시됩니다. 예를 들어 Object
유형의 변수는 참조입니다. int
의 x
指定任何值,而我们正在尝试使用 x
的值来指定 y
raw
으아악
이 두 줄은 >이 없기 때문에 프로그램을 중단시킵니다. 모든 프리미티브는 조작되기 전에 사용 가능한 값으로 초기화되어야 합니다. null
,这意味着“我没有引用任何东西”。如果您以这种方式显式设置引用变量,则可以在引用变量中获取 null
值,或者引用变量未初始化并且编译器不会捕获它(Java 会自动将该变量设置为 null
References변수는 null
로 설정할 수 있습니다. 이는 "아무것도 참조하지 않습니다 "를 의미합니다. 이런 방식으로 참조 변수를 명시적으로 설정하면 참조 변수에서 null
값을 얻을 수 있거나, 참조 변수가 초기화되지 않아 컴파일러가 이를 포착하지 못합니다(Java가 자동으로 변수를 설정함). null
로). NullPointerException
역참조 NullPointerException
하려고 하면
일반적으로 변수를 선언했지만 변수의 내용을 사용하기 전에 개체를 생성하여 변수에 할당하지 않을 때 발생합니다
(NPE). 그래서 실제로 존재하지 않는 것을 언급하고 있는 것입니다. num
的变量,但它实际上还不包含引用值。由于您还没有说出要指向什么,Java 将其设置为 null
으아악
new
关键字用于实例化(或创建)一个Integer
类型的对象,引用变量num
被分配给该 Integer
첫 번째 줄은
num
,,您将得到一个NullPointerException
。在最简单的情况下,编译器会捕获问题并让您知道“num 可能尚未初始化
두 번째 줄,
객체를 생성하기 전에
num
을 역참조하려고 하면 obj
,而是假设它是在调用 doSomething()
num이 초기화되지 않았을 수 있습니다
"라고 알려 주지만 때로는 개체를 직접 생성하지 않는 코드를 작성할 수도 있습니다. 🎜
🎜예를 들어 다음과 같은 방법이 있을 수 있습니다. 🎜
으아악
🎜이 경우 🎜 메서드 이전에 생성된 개체를 생성하지 않습니다. 메소드는 다음과 같이 호출될 수 있습니다. 🎜으아악
이 경우에는 obj
为 null
,并且语句 obj.myMethod()
将抛出 NullPointerException
>.
메서드가 위의 메서드처럼 전달된 개체에 대해 일부 작업을 수행하려는 경우 NullPointerException
를 던지는 것이 적절합니다. 이는 프로그래머 오류이고 프로그래머는 디버깅 목적으로 해당 정보가 필요하기 때문입니다.
메서드 로직으로 인해 발생한 NullPointerException
异常之外,您还可以检查方法参数中的 null
예외 외에도, 메서드 매개변수의
으아악
오류 메시지에 어떤 null
객체가
또는 어떤 경우에는 메서드의 목적이 전달된 개체에 대해 작업을 수행하는 것만이 아니므로 빈 매개 변수가 허용될 수 있습니다. 이 경우 null 매개변수를 확인하고 다르게 동작해야 합니다. 문서에서도 이에 대해 설명해야 합니다. 예를 들어 doSomething()
는 다음과 같이 쓸 수 있습니다.
마지막으로 스택 추적을 사용하여 예외 및 원인을 찾아내는 방법
버그 발견 기능을 갖춘 수중 음파 탐지기는 NPE를 감지할 수 있습니다. 소나는 JVM으로 인한 널 포인터 예외를 동적으로 캡처할 수 있습니다一个>
이제 Java 14에는 NullPointerException의 근본 원인을 보여주는 새로운 언어 기능이 추가되었습니다. 이 언어 기능은 2006년부터 SAP Business JVM의 일부였습니다.
Java 14에서 다음은 NullPointerException 예외 메시지의 예입니다.
NullPointerException
일을 일으키는 상황 목록다음은 Java 언어 사양에서 언급한 대로 NullPointerException
가 직접* 발생하는 모든 상황입니다.
抛出空值;
synchronized (someNullReference) { ... }
NullPointerException
NullPointerException
증가합니다. super
를 호출하면 super
会引发 NullPointerException
가 발생합니다. 혼란스럽다면 이는 정규화된 슈퍼클래스 생성자 호출에 관한 것입니다. 빈 컬렉션/배열을 반복하려면 for (element : iterable)
루프를 사용하세요.
switch (foo) { ... }
(无论是表达式还是语句)在 foo
时可以抛出 NullPointerException
비어 있습니다.
foo.new SomeInnerClass()
当 foo
为 null 时抛出 NullPointerException
.
name1::name2
或 primaryExpression::name
形式的方法引用在以下情况下求值时会抛出 NullPointerException
name1 或 primaryExpression
는 null로 평가됩니다.
JLS의 메모에 따르면 someInstance.someStaticMethod()
不会抛出 NPE,因为 someStaticMethod
是静态的,但 someInstance:: someStaticMethod
여전히 NPE가 발생합니다!
* JLS는 NPE에 대해 간접적으로 이야기할 수도 있다는 점에 유의하세요.