Diferença entre null e vazio

Alguém pode me dizer na pratica a diferença entre null e vazio em java? Tem o string.utils isEmpty. Como é feita esta distinção?

Uma imagem vale mais que mil palavras:

vazio x null

Basicamente, null é a ausência de valor. Se uma variável/referência é null, então ela não tem valor nenhum. E se uma variável qualquer obj for nula, então qualquer tentativa de acessá-la (como chamar um método obj.metodo()) dará erro - neste caso, o NullPointerException.

Já a string vazia é uma string que não tem nenhum caractere. Ela não é nula, pois tem um valor. E esse valor é “nada” (nenhum caractere). No caso de string, como ela representa uma sequência de caracteres, então uma string vazia seria uma sequência vazia (que não contém nenhum caractere). É isso que o método isEmpty verifica, se é vazio ou não.

Ou seja, se s é uma variável do tipo String e eu chamar s.isEmpty():

  • se s for null, dará erro (NullPointerException)
  • se s não for null, o método isEmpty retorna true se ela for vazia (não tem nenhum caractere) ou false caso não seja

Assim:

// string contendo 3 caracteres
String s = "abc";
System.out.println(s.isEmpty()); // false, não é vazia

// string vazia (sem nenhum caractere)
s = "";
System.out.println(s.isEmpty()); // true, é vazia

// string nula
s = null;
System.out.println(s.isEmpty()); // erro, não pode chamar o método pois 's' é null
1 curtida

Mas nao tem o metodo String.Util.isEmpty que verifica o null e vazio e retorna true se for verdadeiro?

StringUtils é de uma biblioteca (se não me engano, do Apache-Commons), e o comportamento do método isEmpty ali foi definido por quem a criou.

No caso, acharam uma boa considerar que tanto null quanto string vazia deve retornar true. Mas aí já não tem a ver com a diferença entre null e vazio que eu comentei, já que a biblioteca considera que são equivalentes.

ok entendi obrigado