O que é NullPointerException no Java e o que causa isso?

Estou estudando Java e queria saber o que é NullPointerException? Queria saber o que causa essa exceção e como evitar esse tipo de erro também.

NullPointerException é um tipo de exceção que é lançada quando se tenta usar algo com valor null como se fosse um objeto comum. Isso pode envolver manipular propriedades, campos, atributos, métodos de um objeto, sem que esse objeto exista.

Situações que causam NullPointerException no Java:

  • Tentar acessar um campo de uma instância cuja referência seja null.
Pessoa p = null;
String nome = p.nome; // <-- NullPointerException é lançado.
  • Tentar acessar um método de uma instância cuja referência seja null
Pessoa p = null;
String nome = p.getNome(); // <-- NullPointerException é lançado.
  • Tentar fazer autounboxing de null
Integer x = null;
int z = x; // NullPointerException é lançado.
  • Tentar lançar nullcomo exceção
Exception x = null;
throw x; //
  • Acessar tamanho de uma variável do tipo array que tenha valor null
String[] x = null;
int tamanho = x.length;
  • Tentar iterar sobre null usando for each
String[] x = null;
for (String y : x) {
    // ...
}
  • Tentar usar synchronized em um objeto null
Object x = null;
synchronized (x) {
    // ...
}
  • Tentar obter uma referência a um método a partir de um objeto null
Pessoa p = null;
Supplier<String> f = p::toString;