Eu quero executar alguma ação SOMENTE SE minha string tiver um valor significativo. Então, eu tentei isso.
if (!myString.equals("")) {
doSomething
}
e isto
if (!myString.equals(null)) {
doSomething
}
e isto
if ( (!myString.equals("")) && (!myString.equals(null))) {
doSomething
}
e isto
if ( (!myString.equals("")) && (myString!=null)) {
doSomething
}
e isto
if ( myString.length()>0) {
doSomething
}
E em todos os casos, meu programa doSomething
, apesar do fato de que minha string É VAZIA. É igual a null
. Então, o que há de errado com isso?
ADICIONADO:
Eu encontrei a razão do problema. A variável foi declarada como uma sequência e, como conseqüência, null
atribuída a essa variável foi transformada em "null"
! Então, if (!myString.equals("null"))
funciona.
null
não possui métodos, também nãoequals()
. SemyString
fossenull
, como você invocaria um método? :)System.out.println(myString)
imediatamente antes do if-block para que você possa ver o que há lá?null
"?null
atribuído a essa variável foi transformado em"null"
- esta é uma péssima idéia. Tente alterar esse design, se possível.Respostas:
Como comentário adicional, você deve estar ciente deste termo no
equals
contrato:De
Object.equals(Object)
:A maneira de comparar com
null
é usarx == null
ex != null
.Além disso,
x.field
ex.method()
jogaNullPointerException
sex == null
.fonte
s.isEmpty()
vez des.length() == 0
legibilidade. Qualquer diferença no desempenho é insignificante. Eu concordo que issos.equals("")
é terrível.Se
myString
estivernull
, liguemyString.equals(null)
oumyString.equals("")
falhará com aNullPointerException
. Você não pode chamar nenhum método de instância em uma variável nula.Verifique se há nulo primeiro assim:
Este faz uso de avaliação de curto-circuito para não tentar a
.equals
semyString
falhar a verificação de nulo.fonte
.isEmpty()
vez de.equals("")
.myString.isEmpty()
. Mas, nesse nível, a legibilidade supera a otimização e as pessoas podem estar mais acostumadas à leituramyString.equals("")
. (Ou possivelmente não).O Apache commons
StringUtils.isNotEmpty
é o melhor caminho a percorrer.fonte
Se myString for de fato nulo, qualquer chamada à referência falhará com uma NPE (Null Pointer Exception). Desde o java 6, use #isEmpty em vez da verificação do comprimento (em qualquer caso, NUNCA crie uma nova String vazia com a verificação).
Aliás, se comparar com literais de String como você faz, reverteria a instrução para não precisar de uma verificação nula, ou seja,
ao invés de :
fonte
TRABALHANDO !!!!
fonte
Você precisa verificar se o
myString
objeto énull
:fonte
Se sua string for nula, chamadas como essa devem gerar uma NullReferenceException:
myString.equals (null)
Mas enfim, acho que um método como esse é o que você deseja:
Então, no seu código, você pode fazer coisas assim:
fonte
Eu recomendaria o uso de um utilitário existente ou a criação de seu próprio método:
Em seguida, basta usá-lo quando precisar:
Como observado acima, o || e && operadores curto-circuito. Isso significa que assim que eles podem determinar seu valor, eles param. Portanto, se (string == null) for verdadeira, a parte do comprimento não precisará ser avaliada, pois a expressão sempre seria verdadeira. Da mesma forma com &&, onde se o lado esquerdo for falso, a expressão será sempre falsa e não precisará mais ser avaliada.
Como uma observação adicional, usar comprimento geralmente é uma ideia melhor do que usar .equals. O desempenho é um pouco melhor (não muito) e não requer criação de objeto (embora a maioria dos compiladores possa otimizar isso).
fonte
Experimentar,
fonte
Incidentalmente, se você estiver fazendo muita manipulação de cadeias, há uma ótima classe Spring com todos os tipos de métodos úteis:
http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/util/StringUtils.html
fonte
Toda vez que tenho que lidar com strings (quase todas as vezes), paro e me pergunto qual é a maneira mais rápida de verificar se há uma string vazia. É claro que a verificação string.Length == 0 deve ser a mais rápida, pois Length é uma propriedade e não deve haver outro processamento além de recuperar o valor da propriedade. Mas então eu me pergunto: por que existe um String.Empty? Deveria ser mais rápido procurar por String.Empty do que por comprimento, digo a mim mesma. Bem, finalmente decidi testá-lo. Codifiquei um pequeno aplicativo do Windows Console que me diz quanto tempo leva para fazer uma determinada verificação de 10 milhões de repetições. Eu verifiquei três strings diferentes: uma string NULL, uma vazia e uma "". Eu usei 5 métodos diferentes: String.IsNullOrEmpty (), str == null, str == null || str == String.Empty, str == nulo || str == "", str == nulo || str.
De acordo com esses resultados, em média, a verificação
str == null
é a mais rápida, mas nem sempre produz o que estamos procurando.if str = String.Empty
oustr = ""
, isso resulta em falso. Então você tem 2 que estão empatados em segundo lugar:String.IsNullOrEmpty()
estr == null || str.length == 0
. Desde queString.IsNullOrEmpty()
parece mais agradável e é mais fácil (e mais rápido) de escrever, eu recomendaria usá-lo sobre a outra solução.fonte
Eu faria algo assim:
fonte
Eu tenho usado
StringUtil.isBlank(string)
Ele testa se uma string está em branco: nulo, vazio ou apenas espaço em branco.
Então este é o melhor até agora
Aqui está o método original dos documentos
fonte
Isso deve funcionar:
Caso contrário, é provável que o myString tenha um valor que você não está esperando. Tente imprimi-lo assim:
O uso dos símbolos '+' para cercar a string mostrará se há espaço em branco extra no qual você não está respondendo.
fonte
if(str.isEmpty() || str==null){ do whatever you want }
fonte
Ok, é assim que os tipos de dados funcionam em Java. (Você precisa desculpar meu inglês, provavelmente não estou usando o vocabulário certo. Você precisa diferenciar entre dois. Os tipos de dados base e os tipos de dados normais. Os tipos de dados base compõem praticamente tudo o que existe. Por exemplo, são todos números, char, booleano, etc. Os tipos de dados normais ou complexos são tudo o mais.Um String é uma matriz de caracteres, portanto um tipo de dados complexo.
Toda variável que você cria é realmente um ponteiro sobre o valor em sua memória. Por exemplo:
a variável "s" NÃO contém uma String. É um ponteiro. Este ponteiro aponta para a variável em sua memória. Quando você chama
System.out.println(anyObject)
, otoString()
método desse objeto é chamado. Se não substituir otoString
objeto, imprimirá o ponteiro. Por exemplo:Tudo por trás do "@" é o ponteiro. Isso funciona apenas para tipos de dados complexos. Tipos de dados primitivos são salvas DIRETAMENTE em seus ponteiros. Portanto, na verdade, não há ponteiro e os valores são armazenados diretamente.
Por exemplo:
Eu não armazeno um ponteiro nesse caso. armazenarei o valor inteiro 123 (em byte ofc).
Ok, então vamos voltar para o
==
operador. Ele sempre compara o ponteiro e não o conteúdo salvo na posição do ponteiro na memória.Exemplo:
Essa String tem um ponteiro diferente. String.equals (String other), no entanto, compara o conteúdo. Você pode comparar tipos de dados primitivos com o operador '==' porque o ponteiro de dois objetos diferentes com o mesmo conteúdo é igual.
Nulo significaria que o ponteiro está vazio. Um tipo de dados primitivo vazio por padrão é 0 (para números). Nulo para qualquer objeto complexo, no entanto, significa que esse objeto não existe.
saudações
fonte
Para mim, a melhor verificação se uma string tem algum conteúdo significativo em Java é esta:
Primeiro, verifique se a string deve
null
ser evitadaNullPointerException
e, em seguida, apare todos os caracteres de espaço para evitar verificar as strings que possuem apenas espaços em branco e, finalmente, verifique se a string aparada não está vazia, ou seja, tem comprimento 0.fonte
Eu tive esse problema no android e uso dessa maneira (trabalhe para mim):
Mas no código java eu uso:
E:
fonte
Eu prefiro usar:
Leia StringUtils.isBlank () vs String.isEmpty () .
fonte
No Android, você pode verificar isso com o método utilitário
isEmpty
deTextUtils
,isEmpty(CharSequence str)
O método verifica tanto a condiçãonull
quanto o comprimento.fonte
Eu sempre uso assim:
ou você pode copiar isso para o seu projeto:
e chame assim:
retornará true se estiver vazio ou nulo.
b=true
se estiver vazio ou nuloou você pode usar try catch and catch quando for nulo.
fonte
Eu acho que myString não é uma string, mas uma matriz de strings. Aqui está o que você precisa fazer:
fonte
Você pode verificar uma sequência igual a nula usando este:
Se o resultado for 0, então (Teste + "") = "nulo".
fonte
Tentei a maioria dos exemplos dados acima para um valor nulo em um aplicativo Android que eu estava criando e tudo falhou. Então, eu vim com uma solução que funcionava a qualquer momento para mim.
Então, simplesmente concatene uma string vazia como fiz acima e teste contra "null" e ela funciona bem. De fato, nenhuma exceção é lançada
fonte
A exceção também pode ajudar:
fonte
Se você estiver trabalhando no Android, poderá usar a classe TextUtils simples. Verifique o seguinte código:
Este é um uso simples de código. A resposta pode ser repetida. Mas é simples ter uma verificação simples e simples para você.
fonte
Você tem que verificar com nulo
if(str != null).
fonte