Como verificar uma string em relação a null em java?


91

Como posso verificar uma string em relação a null em java? estou usando

stringname.equalsignorecase(null)

mas não está funcionando.

Respostas:


163

string == nullcompara se o objeto é nulo. string.equals("foo")compara o valor dentro desse objeto. string == "foo"nem sempre funciona, porque você está tentando ver se os objetos são os mesmos, não os valores que eles representam.


Resposta mais longa:

Se você tentar fazer isso, não funcionará, pois você descobriu:

String foo = null;
if (foo.equals(null)) {
    // That fails every time. 
}

A razão é que foo é nulo, então ele não sabe o que é .equals; não há nenhum objeto a partir do qual .equals possa ser chamado.

O que você provavelmente queria era:

String foo = null;
if (foo == null) {
    // That will work.
}

A maneira típica de se proteger contra um null ao lidar com Strings é:

String foo = null;
String bar = "Some string";
...
if (foo != null && foo.equals(bar)) {
    // Do something here.
}

Dessa forma, se foo for nulo, ele não avalia a segunda metade da condicional e está tudo bem.

A maneira mais fácil, se você estiver usando um literal String (em vez de uma variável), é:

String foo = null;
...
if ("some String".equals(foo)) {
    // Do something here.
}

Se você quiser contornar isso, o Apache Commons tem uma classe - StringUtils - que fornece operações String seguras para nulos.

if (StringUtils.equals(foo, bar)) {
    // Do something here.
}

Outra resposta estava brincando e disse que você deveria fazer o seguinte:

boolean isNull = false;
try {
    stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
    isNull = true;
}

Por favor, não faça isso. Você só deve lançar exceções para erros excepcionais; se você está esperando um valor nulo, deve verificar com antecedência e não deixá-lo lançar a exceção.

Na minha cabeça, existem duas razões para isso. Primeiro, as exceções são lentas; a verificação em relação a nulo é rápida, mas quando a JVM lança uma exceção, leva muito tempo. Em segundo lugar, o código é muito mais fácil de ler e manter se você apenas verificar o ponteiro nulo com antecedência.


2
você perdeu a versão do Yoda, também funciona sempre: if ("foo" .equalsIgnoreCase (string))
Omry Yadan

2
Boa explicação útil. Obrigado por jogar bem.
james.garriss

@aioobe Acho que concordamos? Se você puder ser mais claro, fico feliz em editar.
Dean J

30
s == null

não vai funcionar?


4
@ k38: Você "apenas" precisa usar equals()se quiser comparar valores . Mas se quiser verificar se uma variável é null, use ==.
Felix Kling

18

Claro que funciona. Você está perdendo uma parte vital do código. Você só precisa fazer assim:

boolean isNull = false;
try {
    stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
    isNull = true;
}

;)


23
Se você leu até aqui, perceba que @aioobe está brincando; você não deveria estar fazendo assim.
Dean J

12

Use o método TextUtils se você estiver trabalhando no Android.

TextUtils.isEmpty (str) : Retorna verdadeiro se a string for nula ou de comprimento 0. Parâmetros: str a string a ser examinada Retorna: verdadeiro se str for nulo ou comprimento zero

  if(TextUtils.isEmpty(str)) {
        // str is null or lenght is 0
    }

Abaixo está o código-fonte deste método. Você pode usar direclty.

 /**
     * Returns true if the string is null or 0-length.
     * @param str the string to be examined
     * @return true if str is null or zero length
     */
    public static boolean isEmpty(CharSequence str) {
        if (str == null || str.length() == 0)
            return true;
        else
            return false;
    }

5

Se olharmos para a implementação do método equalsIgnoreCase, encontramos esta parte:

if (string == null || count != string.count) {
    return false;
}

Portanto, ele sempre retornará falsese o argumento for null. E isso está obviamente certo, porque o único caso em que ele deve retornar trueé quando equalsIgnoreCase foi invocado em um null String, mas

String nullString = null;
nullString.equalsIgnoreCase(null);

definitivamente resultará em um NullPointerException.

Portanto, os métodos equals não são projetados para testar se um objeto é nulo, apenas porque você não pode invocá-los null.


4

Isso parece um pouco estranho, mas ...

stringName == null || "".equals(stringName)

Nunca tive problemas ao fazer isso, além de ser uma maneira mais segura de verificar, evitando exceções de pontos nulos em potencial.


cuidado com o NullPointer, neste caso, a segunda condição deve ser a primeira.
Pawan

3

Não tenho certeza do que havia de errado com a resposta do MYYN.

if (yourString != null) {
  //do fun stuff with yourString here
}

A verificação nula acima é muito boa.

Se você está tentando verificar se uma referência de String é igual (ignorando maiúsculas e minúsculas) a outra string que você sabe que não é uma referência nula, faça algo assim:

String x = "this is not a null reference"
if (x.equalsIgnoreCase(yourStringReferenceThatMightBeNull) ) {
  //do fun stuff
}

Se houver qualquer dúvida se você tem ou não referências nulas para ambas as Strings que está comparando, você precisará verificar se há uma referência nula em pelo menos uma delas para evitar a possibilidade de um NullPointerException.


2

Se sua string tiver valor "nulo", você pode usar

if(null == stringName){

  [code]

}

else

[Error Msg]

3
porque null == stringName e não stringName == null? Suponho que não haja diferença, mas por que isso é preferido (e tenho visto muito isso). Minha preferência é ler a ordem LTR, então stringName == null, mas quero saber o que as outras pessoas pensam.
Lukasz 'Severiaan' Grela

7
normalmente em comparação você coloca a variável no lado direito, de modo que você não inicialize a variável por engano: null = stringName produz um erro de compilação enquanto stringName = null seria possível
Sarajog

4
Não é "normal" fazer isso de forma alguma e muitas pessoas o proíbem expressamente, já que não é legível naturalmente para alguém que está lendo a base do código.
RichieHH

2

importe na sua aula

import org.apache.commons.lang.StringUtils;

então use-o, os dois retornarão verdadeiro

System.out.println(StringUtils.isEmpty(""));
System.out.println(StringUtils.isEmpty(null)); 

2

Você pode verificar com String == null

Isso funciona para mim

    String foo = null;
    if(foo == null){
        System.out.println("String is null");
    }

1

Claro, user351809 stringname.equalsignorecase(null)lançará NullPointerException.
Veja, você tem um objeto string stringname, que segue 2 condições possíveis: -

  1. stringnametem um valor de string não nulo (digamos "computador"):
    Seu código funcionará bem, pois assume a forma
    "computer".equalsignorecase(null)
    e você obtém a resposta esperada como false.
  2. stringnametem um nullvalor:
    aqui seu código ficará travado, pois
    null.equalsignorecase(null)
    No entanto, parece bom à primeira vista e você pode esperar uma resposta true, pois ,
    mas, nullnão é um objeto que pode executar o equalsignorecase()método.

Portanto, você obtém a exceção devido ao caso 2.
O que eu sugiro que você simplesmente usestringname == null


1

Método simples:

public static boolean isBlank(String value) {
    return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}

1

Se o valueretornado for nulo, use:

if(value.isEmpty());

Às vezes, para verificar o valor nulo, if(value == null)em java, pode não ser verdadeiro mesmo que a string seja nula.


1
Usar Scala (com Java) if(value.isEmpty())NullPointerException. Neste caso é melhor usarif(value == null)
Andrea

Isso é definitivamente errado, pois sempre lançará NPE se nulo.
Roger

1

Com Java 7 você pode usar

if (Objects.equals(foo, null)) {
    ...
}

que retornará truese ambos os parâmetros forem null.


0

Sei que isso foi respondido há muito tempo, mas não vi isso postado, então pensei em compartilhar o que faço. Isso não é particularmente bom para a legibilidade do código, mas se você tiver que fazer uma série de verificações de nulos, gosto de usar:

String someString = someObject.getProperty() == null ? "" : someObject.getProperty().trim();

Neste exemplo, trim é chamado na string, o que lançaria um NPE se a string fosse nula ou espaços, mas na mesma linha, você pode verificar se há nulo ou em branco para não acabar com uma tonelada de (mais ) difícil de formatar se blocos.


O que você quer dizer com verificar se há nulo ou em branco? Você só está verificando se há nulo aqui. O branco é uma das possíveis devoluções do "COND? A: B;" construir, certo?
philo vivero

0

Se bem entendi, isso deve bastar:

if(!stringname.isEmpty())
// an if to check if stringname is not null
if(stringname.isEmpy())
// an if to check if stringname is null

-2

Bem, a última vez que alguém fez essa pergunta boba, a resposta foi:

someString.equals("null")

Essa "correção" apenas esconde o problema maior de como nullse torna, "null"em primeiro lugar.


Não funciona - então esta não é uma solução e nem uma resposta útil.
Chris Stratton

Eu gostaria de ser o primeiro a dizer: "wat"
philo vivero

isso não responde à pergunta
jason adams

-2

Existem duas maneiras de fazer isso .. Diga String == null ou string.equals () ..

public class IfElse {

    public int ifElseTesting(String a){
        //return null;
        return (a== null)? 0: a.length();
    }

}

public class ShortCutifElseTesting {

    public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);
        System.out.println("enter the string please:");
        String a=scanner.nextLine();
        /*
        if (a.equals(null)){
            System.out.println("you are not correct");
        }
        else if(a.equals("bangladesh")){
            System.out.println("you are right");
        }
        else
            System.out.println("succesful tested");

        */
        IfElse ie=new IfElse();
        int result=ie.ifElseTesting(a);
        System.out.println(result);

    }

}

Verifique este exemplo ... Aqui está outro exemplo de versão de atalho de If Else ..


1
Não! .equals () não deve ser usado com um objeto potencialmente nulo, portanto, a explicação introdutória está errada. E o resto dessa resposta parece sem sentido e sem relação com a pergunta feita.
Chris Stratton
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.