What is a NullPointerException, and how do I fix it?

A Null Pointer Exception (NPE), represented as java.lang.NullPointerException, occurs when a Java program attempts to use a null reference where an object is required. It’s one of the most common runtime exceptions in Java and is typically caused by attempting to:

  1. Call a method on a null object.
<span>String</span> <span>str</span> <span>=</span> <span>null</span><span>;</span>
<span>str</span><span>.</span><span>length</span><span>();</span> <span>// Causes NullPointerException</span>
   <span>String</span> <span>str</span> <span>=</span> <span>null</span><span>;</span>
   <span>str</span><span>.</span><span>length</span><span>();</span> <span>// Causes NullPointerException</span>
String str = null; str.length(); // Causes NullPointerException

Enter fullscreen mode Exit fullscreen mode

  1. Access or modify a field of a null object.
<span>MyObject</span> <span>obj</span> <span>=</span> <span>null</span><span>;</span>
<span>obj</span><span>.</span><span>field</span> <span>=</span> <span>5</span><span>;</span> <span>// Causes NullPointerException</span>
   <span>MyObject</span> <span>obj</span> <span>=</span> <span>null</span><span>;</span>
   <span>obj</span><span>.</span><span>field</span> <span>=</span> <span>5</span><span>;</span> <span>// Causes NullPointerException</span>
MyObject obj = null; obj.field = 5; // Causes NullPointerException

Enter fullscreen mode Exit fullscreen mode

  1. Access elements in a null array.
<span>int</span><span>[]</span> <span>arr</span> <span>=</span> <span>null</span><span>;</span>
<span>arr</span><span>[</span><span>0</span><span>]</span> <span>=</span> <span>10</span><span>;</span> <span>// Causes NullPointerException</span>
   <span>int</span><span>[]</span> <span>arr</span> <span>=</span> <span>null</span><span>;</span>
   <span>arr</span><span>[</span><span>0</span><span>]</span> <span>=</span> <span>10</span><span>;</span> <span>// Causes NullPointerException</span>
int[] arr = null; arr[0] = 10; // Causes NullPointerException

Enter fullscreen mode Exit fullscreen mode

  1. Pass null as an argument to a method that doesn’t accept it.
<span>myMethod</span><span>(</span><span>null</span><span>);</span> <span>// If myMethod doesn't handle null, it might cause an NPE</span>
   <span>myMethod</span><span>(</span><span>null</span><span>);</span> <span>// If myMethod doesn't handle null, it might cause an NPE</span>
myMethod(null); // If myMethod doesn't handle null, it might cause an NPE

Enter fullscreen mode Exit fullscreen mode

  1. Return null from a method where an object is expected, and then use the returned value without null-checking.

Methods/Tools to Determine and Prevent NullPointerException:

1. Understand the Stack Trace

  • When a NullPointerException is thrown, the JVM provides a stack trace pointing to the exact line where the exception occurred.
  • Examine the line and identify the expression that evaluates to null.

Example Stack Trace:

Exception in thread "main" java.lang.NullPointerException
at MainClass.main(MainClass.java:10)
   Exception in thread "main" java.lang.NullPointerException
       at MainClass.main(MainClass.java:10)
Exception in thread "main" java.lang.NullPointerException at MainClass.main(MainClass.java:10)

Enter fullscreen mode Exit fullscreen mode

Look at MainClass.java:10 to identify the issue.


2. Null Checks

  • Before accessing an object, explicitly check if it is null.
<span>if</span> <span>(</span><span>myObject</span> <span>!=</span> <span>null</span><span>)</span> <span>{</span>
<span>myObject</span><span>.</span><span>doSomething</span><span>();</span>
<span>}</span>
   <span>if</span> <span>(</span><span>myObject</span> <span>!=</span> <span>null</span><span>)</span> <span>{</span>
       <span>myObject</span><span>.</span><span>doSomething</span><span>();</span>
   <span>}</span>
if (myObject != null) { myObject.doSomething(); }

Enter fullscreen mode Exit fullscreen mode


3. Use Optional (Java 8 and later)

  • Wrap potentially null values in java.util.Optional, which provides methods like isPresent() or ifPresent() to safely handle null.
<span>Optional</span><span><</span><span>String</span><span>></span> <span>optionalStr</span> <span>=</span> <span>Optional</span><span>.</span><span>ofNullable</span><span>(</span><span>str</span><span>);</span>
<span>optionalStr</span><span>.</span><span>ifPresent</span><span>(</span><span>s</span> <span>-></span> <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>s</span><span>.</span><span>length</span><span>()));</span>
   <span>Optional</span><span><</span><span>String</span><span>></span> <span>optionalStr</span> <span>=</span> <span>Optional</span><span>.</span><span>ofNullable</span><span>(</span><span>str</span><span>);</span>
   <span>optionalStr</span><span>.</span><span>ifPresent</span><span>(</span><span>s</span> <span>-></span> <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>s</span><span>.</span><span>length</span><span>()));</span>
Optional<String> optionalStr = Optional.ofNullable(str); optionalStr.ifPresent(s -> System.out.println(s.length()));

Enter fullscreen mode Exit fullscreen mode


4. Annotations for Nullability

  • Use annotations like @Nullable and @NonNull to signal which variables or parameters can be null and which cannot.
  • IDEs like IntelliJ IDEA or Eclipse can warn you at compile-time if you misuse these.

5. Debugger Tools

  • Use an IDE’s debugger to inspect the state of variables at runtime and identify the null value causing the exception.

6. Use Objects.requireNonNull()

  • Validate inputs or object states early in the code using Objects.requireNonNull().
<span>this</span><span>.</span><span>name</span> <span>=</span> <span>Objects</span><span>.</span><span>requireNonNull</span><span>(</span><span>name</span><span>,</span> <span>"Name must not be null"</span><span>);</span>
   <span>this</span><span>.</span><span>name</span> <span>=</span> <span>Objects</span><span>.</span><span>requireNonNull</span><span>(</span><span>name</span><span>,</span> <span>"Name must not be null"</span><span>);</span>
this.name = Objects.requireNonNull(name, "Name must not be null");

Enter fullscreen mode Exit fullscreen mode


7. Default Values

  • Assign default values to avoid null altogether.
<span>String</span> <span>str</span> <span>=</span> <span>someMethod</span><span>()</span> <span>!=</span> <span>null</span> <span>?</span> <span>someMethod</span><span>()</span> <span>:</span> <span>""</span><span>;</span>
   <span>String</span> <span>str</span> <span>=</span> <span>someMethod</span><span>()</span> <span>!=</span> <span>null</span> <span>?</span> <span>someMethod</span><span>()</span> <span>:</span> <span>""</span><span>;</span>
String str = someMethod() != null ? someMethod() : "";

Enter fullscreen mode Exit fullscreen mode


8. Lombok @NonNull Annotation

  • If using Lombok, annotate parameters or fields with @NonNull to auto-generate null-checking code.
<span>public</span> <span>void</span> <span>setName</span><span>(</span><span>@NonNull</span> <span>String</span> <span>name</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>name</span> <span>=</span> <span>name</span><span>;</span>
<span>}</span>
   <span>public</span> <span>void</span> <span>setName</span><span>(</span><span>@NonNull</span> <span>String</span> <span>name</span><span>)</span> <span>{</span>
       <span>this</span><span>.</span><span>name</span> <span>=</span> <span>name</span><span>;</span>
   <span>}</span>
public void setName(@NonNull String name) { this.name = name; }

Enter fullscreen mode Exit fullscreen mode

原文链接:What is a NullPointerException, and how do I fix it?

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
You have to work very hard to seem effortless.
你必须十分努力,才能看上去毫不费劲
评论 抢沙发

请登录后发表评论

    暂无评论内容