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

asked16 years ago
last updated8 years ago
viewed3.9m times
Up Vote209Down Vote

What are Null Pointer Exceptions (java.lang.NullPointerException) and what causes them?

What methods/tools can be used to determine the cause so that you stop the exception from causing the program to terminate prematurely?

11 Answers

Up Vote10Down Vote
Grade: A

What is a NullPointerException?

A NullPointerException occurs when a program attempts to access or use an object reference that is null. In Java, every object reference has a default value of null, indicating that it does not refer to any object.

Causes of NullPointerExceptions

NullPointerExceptions can occur for various reasons, including:

  • Dereferencing a variable that has not been initialized or has been set to null.
  • Calling a method on an object that is null.
  • Accessing a field of an object that is null.
  • Passing a null reference to a method that expects a non-null argument.

Identifying the Cause

To determine the cause of a NullPointerException, you can use the following methods/tools:

  • Debugging: Use a Java debugger to step through the code and inspect the values of variables. This allows you to identify which variable is null and why.
  • Exception Stack Trace: The exception stack trace provides information about the sequence of method calls that led to the exception. It can help you identify the source of the null reference.
  • Logging: Use logging to record information about the program's execution, including the values of variables and the stack trace of exceptions. This can help you analyze the cause of the exception later.
  • Static Analysis Tools: Static analysis tools, such as FindBugs or Lint, can scan your code and identify potential sources of NullPointerExceptions.

Fixing NullPointerExceptions

To fix a NullPointerException, you need to identify the source of the null reference and modify the code to ensure that the object reference is not null when it is accessed. Common approaches include:

  • Initializing Variables: Initialize variables to non-null values before using them.
  • Null Checks: Perform null checks before accessing or using object references.
  • Optional Objects: Use Java 8's Optional class to handle nullable references.
  • Defensive Coding: Assume that objects can be null and handle them accordingly.
  • Third-Party Libraries: Use third-party libraries that provide tools for handling nullable references, such as Guava's Optional or Lombok's @NonNull annotation.
Up Vote10Down Vote
Grade: A

NullPointerException Explained:

A NullPointerException (NPE) is a runtime exception in Java that occurs when you attempt to access a method or field on a null object. In other words, it's caused by trying to operate on an object that has not been initialized or is not referencing any object.

Causes of NullPointerException:

  • Attempting to access a method or field on a null object: This can happen when you try to access a method or field on a variable that is null.
  • Null object assignment: Assigning a null value to a variable that expects an object will also lead to a NullPointerException.
  • Null object creation: Creating a new object with a null constructor can result in a NullPointerException when you try to access its methods or fields.

Tools and Methods to Find the Cause:

  • Stack Trace: The stack trace is a key element of a NullPointerException and provides information about the call stack at the time of the exception. It helps you identify the code snippet where the exception occurred and the sequence of events leading up to the error.
  • Debugging Tools: Tools like debuggers and profilers allow you to step through the code line-by-line and identify the exact cause of the NullPointerException.
  • Null Object Checks: Incorporating null object checks with null keyword or Objects.nonNull() method before accessing methods or fields can help prevent NullPointerException.
  • Logging: Adding logging statements at key points in your code can help you track the flow of control and identify the root cause of the exception.
  • Exception Handling: Implementing proper exception handling techniques, such as try-catch blocks, can help you catch and handle NullPointerException gracefully.

Additional Tips:

  • Use defensive coding techniques to avoid NullPointerException, such as checking for null before accessing methods or fields.
  • Follow coding standards and practices that promote null safety, such as using Optional objects or defensive cloning.
  • Consider using static analysis tools to identify potential NullPointerException issues during development.
  • Test your code thoroughly to uncover NullPointerException errors during unit testing.

Remember:

NullPointerException is a common exception in Java, but it can be avoided with careful coding practices and the use of debugging tools. By understanding the causes and methods to find the cause, you can effectively prevent NullPointerException from terminating your program prematurely.

Up Vote10Down Vote
Grade: A

A NullPointerException in Java occurs when you try to access or invoke methods on an object that is null. In other words, it's an attempt to use a reference variable that doesn't refer to any object. This exception usually results in the termination of the program, or at least the current thread, unless it is properly handled with a try-catch block.

Here's a simple example that demonstrates a NullPointerException:

String nullString = null;
nullString.length(); // This will cause a NullPointerException

To determine the cause of a NullPointerException, you can follow these steps:

  1. Check the Stack Trace: When a NullPointerException is thrown, it will be accompanied by a stack trace that indicates the method and line number where the exception occurred. The stack trace can be found in the console or log file, depending on your application's configuration.

  2. Identify the Reference Variable: In the stack trace, find the reference variable that is causing the NullPointerException. This variable is the one that is null and should be the focus of your investigation.

  3. Trace Back: Go back through your code to determine how the reference variable became null. It could be due to insufficient input validation, resource management issues, or other programming mistakes.

  4. Add Null Checks: To prevent NullPointerExceptions, you can add null checks before accessing or invoking methods on objects. Here's an example:

String nullString = null;
if (nullString != null) {
    nullString.length();
} else {
    System.out.println("nullString is null!");
}
  1. Use Debugging Tools: Debugging tools like breakpoints, step-by-step execution, and variable inspections can help you understand the state of your application and find the cause of a NullPointerException.

  2. Consider Using Optional: Java 8 introduced the java.util.Optional class to provide a more concise and expressive way to handle null values. Using Optional can help you avoid NullPointerExceptions and make your code more robust. Here's an example:

Optional<String> optionalString = Optional.ofNullable(nullString);
int length = optionalString.map(String::length).orElse(-1); // -1 indicates null value

By following these steps and using the proper tools, you can fix NullPointerExceptions, improve your code quality, and ensure a more stable application.

Up Vote9Down Vote

There are two overarching types of variables in Java:

  1. Primitives: variables that contain data. If you want to manipulate the data in a primitive variable you can manipulate that variable directly. By convention primitive types start with a lowercase letter. For example variables of type int or char are primitives.
  2. References: variables that contain the memory address of an Object i.e. variables that refer to an Object. If you want to manipulate the Object that a reference variable refers to you must dereference it. Dereferencing usually entails using . to access a method or field, or using [ to index an array. By convention reference types are usually denoted with a type that starts in uppercase. For example variables of type Object are references.

Consider the following code where you declare a variable of type int and don't initialize it:

int x;
int y = x + x;

These two lines will crash the program because no value is specified for x and we are trying to use x's value to specify y. All primitives have to be initialized to a usable value before they are manipulated. Now here is where things get interesting. variables can be set to null which means "". You can get a null value in a reference variable if you explicitly set it that way, or a reference variable is uninitialized and the compiler does not catch it (Java will automatically set the variable to null). If a reference variable is set to null either explicitly by you or through Java automatically, and you attempt to it you get a NullPointerException. The NullPointerException (NPE) typically occurs when you declare a variable but did not create an object and assign it to the variable before trying to use the contents of the variable. So you have a reference to something that does not actually exist. Take the following code:

Integer num;
num = new Integer(10);

The first line declares a variable named num, but it does not actually contain a reference value yet. Since you have not yet said what to point to, Java sets it to null. In the second line, the new keyword is used to instantiate (or create) an object of type Integer, and the reference variable num is assigned to that Integer object. If you attempt to dereference num creating the object you get a NullPointerException. In the most trivial cases, the compiler will catch the problem and let you know that "num may not have been initialized," but sometimes you may write code that does not directly create the object. For instance, you may have a method as follows:

public void doSomething(SomeObject obj) {
   // Do something to obj, assumes obj is not null
   obj.myMethod();
}

In which case, you are not creating the object obj, but rather assuming that it was created before the doSomething() method was called. Note, it is possible to call the method like this:

doSomething(null);

In which case, obj is null, and the statement obj.myMethod() will throw a NullPointerException. If the method is intended to do something to the passed-in object as the above method does, it is appropriate to throw the NullPointerException because it's a programmer error and the programmer will need that information for debugging purposes. In addition to NullPointerExceptions thrown as a result of the method's logic, you can also check the method arguments for null values and throw NPEs explicitly by adding something like the following near the beginning of a method:

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

Note that it's helpful to say in your error message clearly object cannot be null. The advantage of validating this is that 1) you can return your own clearer error messages and 2) for the rest of the method you know that unless obj is reassigned, it is not null and can be dereferenced safely. Alternatively, there may be cases where the purpose of the method is not solely to operate on the passed in object, and therefore a null parameter may be acceptable. In this case, you would need to check for a and behave differently. You should also explain this in the documentation. For example, doSomething() could be written as:

/**
  * @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
    }
}

Finally, How to pinpoint the exception & cause using Stack Trace

What methods/tools can be used to determine the cause so that you stop the exception from causing the program to terminate prematurely? Sonar with find bugs can detect NPE. Can sonar catch null pointer exceptions caused by JVM Dynamically Now Java 14 has added a new language feature to show the root cause of NullPointerException. This language feature has been part of SAP commercial JVM since 2006. In Java 14, the following is a sample NullPointerException Exception message: in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.size()" because "list" is null

List of situations that cause a NullPointerException to occur

Here are all the situations in which a NullPointerException occurs, that are directly* mentioned by the Java Language Specification:

      • throw null;- - synchronized (someNullReference) { ... }- NullPointerException- NullPointerException- super``NullPointerException
class Outer {
    class Inner {}
}
class ChildOfInner extends Outer.Inner {
    ChildOfInner(Outer o) { 
        o.super(); // if o is null, NPE gets thrown
    }
}
  • Using a for (element : iterable) loop to loop through a null collection/array.- switch (foo) { ... } (whether its an expression or statement) can throw a NullPointerException when foo is null.- foo.new SomeInnerClass() throws a NullPointerException when foo is null.- Method references of the form name1::name2 or primaryExpression::name throws a NullPointerException when evaluated when name1 or primaryExpression evaluates to null.a note from the JLS here says that, someInstance.someStaticMethod() doesn't throw an NPE, because someStaticMethod is static, but someInstance::someStaticMethod still throw an NPE!
Up Vote9Down Vote
Grade: A

A NullPointerException (NPE) in Java occurs when the program tries to use an object reference that hasn't been properly initialized. In other words, you have attempted to access or invoke a method of a null-valued reference variable causing it.

Here is what can cause NPEs:

  1. When attempting to dereference (access) a field whose value has not been initialized: Object obj; // obj has no type here - so it’s null System.out.println(obj.toString());//this will throw NullPointerException
  2. Calling methods on a variable that is uninitialized or set to null:
    String str = null; 
    System.out.println(str.length()); // throws NullPointerException
    
  3. In situations when the return of method doesn't initialize the expected value, such as from a wrapper class that provides static methods. For example, Integer.toString(null) will throw an NPE.
  4. When trying to access or modify data in a collection like ArrayList etc., after nullifying it:
    ArrayList<String> list = new ArrayList<>();
    list.add("element1");
    list = null; // Now the reference 'list' points to nothing (null)
    System.out.println(list.get(0));// This will throw NullPointerException 
    
  5. In case of recursive calls on methods with no proper termination conditions, like in infinite loops. For example: methodCall(); // this method never ends and does not return any value to the caller
  6. When creating or instantiating new instances of a class through reflection where constructor threw exception during instance creation.

Here are few ways how you can avoid these exceptions:

  1. Always initialize variables before usage, at the point in the code that sets them, not later on.
  2. Always check for null when dealing with objects or references; i.e., use conditional checks (if, if-else, assert) to make sure that object is not null before you try and use it. This is generally more prone to NPE than simply referencing an uninitialized variable.
  3. In your code always provide meaningful default values for fields which may be nullable so you avoid unnecessary null checks in your methods.
  4. You can also use a tool like FindBugs, Eclipse's Null Analysis or similar tools that help catch potential NPE issues during compile time rather than just at runtime.
  5. When using the Java library and it has API to handle these situations (e.g., Optional), make sure you know what it does: do not assume that if a method might return null, then in fact it won’t; instead, check whether any of its results are null as required by the method's documentation.
Up Vote8Down Vote
Grade: B

A NullPointerException (NPE) is a type of runtime exception in Java which occurs when an application tries to use a reference variable that doesn't have any value, also known as being null. Java objects and arrays can only be manipulated through valid references. When a program uses a null reference, the Java Virtual Machine (JVM) raises a NullPointerException.

Some common causes of NullPointerExceptions include:

  1. Dereferencing a null variable. For example, trying to call a method or access a property on an object that is null.
  2. Assigning a null value to a non-nullable reference type, like int[], String or any other Object in Java.
  3. Calling methods recursively without properly handling the base case (terminating condition). This can lead to stack underflow, and when you attempt to call a method on a stack frame that no longer exists, you'll get a NullPointerException.

To find the cause of a NullPointerException in your code:

  1. Examine the stack trace. A stack trace shows you the sequence of method calls that led to the exception, so it can help pinpoint where the null reference was introduced in your code.
  2. Use Debugging tools like breakpoints, step-through debugger and print statements to check values at runtime. This will help you determine which variable or object is null, and understand why it became that way.
  3. Perform null checks consistently throughout the application. Make sure all required objects have valid values before using them. In many IDEs such as IntelliJ, Eclipse etc, you can enable null-check warnings to be notified if you are trying to call methods on a variable which might be null.
  4. Consider implementing defensive programming techniques such as optionals or checking if an object is null before using it in your code. This can help prevent NullPointerExceptions from occurring in the first place.
  5. Inspect design and architecture: If you're frequently getting NullPointerExceptions, consider refactoring the architecture of your application to make sure objects and dependencies are managed in a more robust way.
Up Vote7Down Vote
Grade: B

A NullPointerException (NPE) is an exception thrown by the Java Virtual Machine (JVM) when a null reference is encountered, usually due to an uninitialized variable or an object that has been garbage collected. It's one of the most common types of errors in programming and can happen when you try to access or manipulate a variable that has not yet been created.

A NullPointerException typically occurs when code attempts to dereference a null reference, either through direct field access or through a method call. When an object is garbage collected, it is flagged for destruction, and if it is still being accessed by the application at this time, a NPE will be thrown. This is known as a null pointer access (NPA) violation.

It's important to fix NullPointerException because they can cause serious problems in your code, including:

  1. System crashes - If the exception occurs in a critical area of the application that cannot afford to fail, it may cause your program to crash or terminate unexpectedly. This can result in data loss or other issues, depending on the type of application you are running.
  2. Difficulties testing - NullPointerExceptions make it difficult to test different branches of your code effectively, leading to errors that can be challenging to track down and fix.
  3. Memory leaks-NullPointerExceptions may also indicate a memory leak issue in your program. When the JVM encounters a null reference, it will not garbage collect it automatically. This could lead to memory issues if not addressed, as your program runs longer and more data is created.
  4. Complications - NullPointerException can make it difficult to understand what is actually causing an error, making it harder to isolate the issue and find a solution. As a result, you may end up spending hours or even days troubleshooting the problem when an exception was thrown within your code.

To identify and fix NPEs, try using the following techniques:

  1. Error logs-Error messages are generated by your program as soon as it encounters the null pointer access violation. Logs can provide valuable information about the issue and the location of the error. You can use this to search for clues on what caused the problem or what else may have gone wrong in the application.
  2. Debuggers-A debugger is an essential tool for troubleshooting your code when you encounter a null pointer exception. You can inspect your program's state at runtime, including its variables and methods. This helps identify the area of the code where the problem occurs so you can fix it effectively.
  3. Unit tests-Unit tests allow you to test different branches of your code to determine if they are causing the error. Running unit tests frequently helps catch errors early in the development process and makes it easier to diagnose the cause and solve the issue quickly.
  4. Code reviews-Reviewing your program's code after encountering an error can help identify any null pointers or other issues that may have gone unnoticed before. You should carefully check for errors, syntax problems, and areas where variables could have been misused or overwritten inadvertently.
  5. Code Analysis Tools-There are many third-party tools that can analyze your code to find potential errors that could cause null pointer exceptions. Some common examples include Eclipse's Code Analyzer, FindBugs, and PMD. These tools scan the code you have written and provide feedback on best practices and potential issues that could lead to null pointer exceptions or other types of errors in your program.

In conclusion, NullPointerException is one of the most common runtime exceptions that a Java developer can encounter when programming in Java. They are caused by null references, either because they have not been initialized or because they have already been garbage collected. It is essential to handle null pointers effectively, identify and fix them promptly, and use appropriate error handling techniques to avoid premature program termination.

Up Vote7Down Vote
Grade: B

NullPointer exceptions occur when a variable, reference, or other object in Java is null and accessing it. It is generally caused by using null as an argument for some function instead of the actual value being referenced.

To determine the cause of a NullPointerException and avoid program termination, you can use try-catch blocks, debuggers like JUnit or IntelliJ IDEA, or even examine the program's stack traces to identify where in the code this is happening. You can also consider using null-safe data types (such as List) to prevent null reference from causing exceptions.

Up Vote6Down Vote
Grade: B

What is a NullPointerException?

A NullPointerException occurs when an attempt is made to access a method or property of a null object. Null objects have no memory allocated to them, and accessing their methods and properties causes an exception.

Causes of NullPointerException:

  • Setting a null value to a variable
  • Calling a method on a null object
  • Passing a null value to a method or property that requires a non-null object

Methods and Tools to Determine the Cause:

  • Debug statements: Use System.out.println() to print the value of the variable or object before accessing its methods or properties.
  • Exception details: The exception often contains information about the null object and the specific method or property that was accessed.
  • Use a debugger: Attach a debugger to your running application and set breakpoints to pause the execution at the point where the exception is thrown.
  • Print the StackTrace: The StackTrace provides a detailed log of the call stack, which can help you identify the point where the null object was created.

Example:

String name = null;

// Accessing a method on the null object will cause a NullPointerException
name.toUpperCase();

How to Fix NullPointerException:

  • Handle the null value: Check for the null value before accessing the object or property. Use if statements, null checks, or conditional expressions.
  • Initialize the variable: Assign a default value (e.g., an empty string or zero) to the variable before setting it.
  • Use a defensive copy: Create a deep copy of the object before modifying it to prevent changes to the original object.
  • Use the notNull() method: Call the notNull() method to ensure the object is not null before accessing its methods or properties.
  • Use a try-catch block: Surround your code with a try block to handle the null exception gracefully.

Additional Tips:

  • Use if (object != null) or Objects.requireNonNull(object) to ensure the object is not null before accessing its methods or properties.
  • Use System.out.println(object) to print the value of the object to the console to verify its existence.
  • Refer to the Java documentation and tutorials for more information on NullPointerException handling and exception handling techniques.
Up Vote5Down Vote
Grade: C

java.lang.NullPointerException occurs when an object that is referenced in code (using = operator) does not exist. There are several methods/tools you can use to determine the cause of a NullPointerException so that you stop the exception from causing the program to terminate prematurely:

  1. Look for references to non-existent objects. By looking for references to non-existent objects, you can identify the specific line of code that is causing theNullPointerException, allowing you to fix it more easily.
  2. Check for null values when accessing object fields or properties. When checking for null values when accessing object fields or properties, you can identify any potential issues before they cause problems during runtime.
  3. **Use try-with-resources blocks and Java annotations`? Using try-with-resources blocks and Java annotations allows you to write code that automatically manages resources such as threads and files, making your code more efficient and easier to maintain. Additionally, using Java annotations allows you to mark code elements in your program, such as fields or method invocations, with additional information and context, allowing other developers to understand and use the marked code effectively and efficiently.
  4. Use debugger tools in your development environment. Using debugger tools in your development environment allows you to step through your code, line by line, and inspect the values of any variables or objects that are being accessed, allowing you to identify any potential issues before they cause problems during runtime.
  5. Test your program thoroughly with a variety of inputs and conditions. Testing your program thoroughly with a variety of inputs and conditions allows you to identify and fix any potential issues before they cause problems during runtime. Additionally, testing your program thoroughly with a variety of inputs and conditions can also help you improve the performance and reliability of your program by identifying and fixing any potential performance or reliability issues before they cause problems during runtime. In conclusion, java.lang.NullPointerException occurs when an object that is referenced in code (using = operator) does not exist. In order to determine the cause so that you stop the exception from causing the program to terminate prematurely, you can use a variety of methods and tools, including looking for references to non-existent objects, checking for null values when accessing object fields or properties, using try-with-resources blocks and Java annotations, using debugger tools in your development environment, and testing your program thoroughly with a variety of inputs and conditions.
Up Vote4Down Vote
Grade: C

There are two overarching types of variables in Java:

  1. Primitives: variables that contain data. If you want to manipulate the data in a primitive variable you can manipulate that variable directly. By convention primitive types start with a lowercase letter. For example variables of type int or char are primitives.
  2. References: variables that contain the memory address of an Object i.e. variables that refer to an Object. If you want to manipulate the Object that a reference variable refers to you must dereference it. Dereferencing usually entails using . to access a method or field, or using [ to index an array. By convention reference types are usually denoted with a type that starts in uppercase. For example variables of type Object are references.

Consider the following code where you declare a variable of type int and don't initialize it:

int x;
int y = x + x;

These two lines will crash the program because no value is specified for x and we are trying to use x's value to specify y. All primitives have to be initialized to a usable value before they are manipulated. Now here is where things get interesting. variables can be set to null which means "". You can get a null value in a reference variable if you explicitly set it that way, or a reference variable is uninitialized and the compiler does not catch it (Java will automatically set the variable to null). If a reference variable is set to null either explicitly by you or through Java automatically, and you attempt to it you get a NullPointerException. The NullPointerException (NPE) typically occurs when you declare a variable but did not create an object and assign it to the variable before trying to use the contents of the variable. So you have a reference to something that does not actually exist. Take the following code:

Integer num;
num = new Integer(10);

The first line declares a variable named num, but it does not actually contain a reference value yet. Since you have not yet said what to point to, Java sets it to null. In the second line, the new keyword is used to instantiate (or create) an object of type Integer, and the reference variable num is assigned to that Integer object. If you attempt to dereference num creating the object you get a NullPointerException. In the most trivial cases, the compiler will catch the problem and let you know that "num may not have been initialized," but sometimes you may write code that does not directly create the object. For instance, you may have a method as follows:

public void doSomething(SomeObject obj) {
   // Do something to obj, assumes obj is not null
   obj.myMethod();
}

In which case, you are not creating the object obj, but rather assuming that it was created before the doSomething() method was called. Note, it is possible to call the method like this:

doSomething(null);

In which case, obj is null, and the statement obj.myMethod() will throw a NullPointerException. If the method is intended to do something to the passed-in object as the above method does, it is appropriate to throw the NullPointerException because it's a programmer error and the programmer will need that information for debugging purposes. In addition to NullPointerExceptions thrown as a result of the method's logic, you can also check the method arguments for null values and throw NPEs explicitly by adding something like the following near the beginning of a method:

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

Note that it's helpful to say in your error message clearly object cannot be null. The advantage of validating this is that 1) you can return your own clearer error messages and 2) for the rest of the method you know that unless obj is reassigned, it is not null and can be dereferenced safely. Alternatively, there may be cases where the purpose of the method is not solely to operate on the passed in object, and therefore a null parameter may be acceptable. In this case, you would need to check for a and behave differently. You should also explain this in the documentation. For example, doSomething() could be written as:

/**
  * @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
    }
}

Finally, How to pinpoint the exception & cause using Stack Trace

What methods/tools can be used to determine the cause so that you stop the exception from causing the program to terminate prematurely? Sonar with find bugs can detect NPE. Can sonar catch null pointer exceptions caused by JVM Dynamically Now Java 14 has added a new language feature to show the root cause of NullPointerException. This language feature has been part of SAP commercial JVM since 2006. In Java 14, the following is a sample NullPointerException Exception message: in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.size()" because "list" is null

List of situations that cause a NullPointerException to occur

Here are all the situations in which a NullPointerException occurs, that are directly* mentioned by the Java Language Specification:

      • throw null;- - synchronized (someNullReference) { ... }- NullPointerException- NullPointerException- super``NullPointerException
class Outer {
    class Inner {}
}
class ChildOfInner extends Outer.Inner {
    ChildOfInner(Outer o) { 
        o.super(); // if o is null, NPE gets thrown
    }
}
  • Using a for (element : iterable) loop to loop through a null collection/array.- switch (foo) { ... } (whether its an expression or statement) can throw a NullPointerException when foo is null.- foo.new SomeInnerClass() throws a NullPointerException when foo is null.- Method references of the form name1::name2 or primaryExpression::name throws a NullPointerException when evaluated when name1 or primaryExpression evaluates to null.a note from the JLS here says that, someInstance.someStaticMethod() doesn't throw an NPE, because someStaticMethod is static, but someInstance::someStaticMethod still throw an NPE!