Estou criando um aplicativo que recupera imagens da web. Caso a imagem não possa ser recuperada, outra imagem local deve ser usada.
Ao tentar executar as seguintes linhas:
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable.equals(null)) {
drawable = getRandomDrawable();
}
A linha if (drawable.equals (null)) lança uma exceção se drawable for nulo.
Alguém sabe como o valor de drawable deve ser verificado para não lançar uma exceção caso seja nulo e recuperar a imagem local (execute drawable = getRandomDrawable ())?
Respostas:
Solução Java 8 editada:
final Drawable drawable = Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath())) .orElseGet(() -> getRandomDrawable());
Você pode declarar
drawable
final
neste caso.Como Chasmo apontou, o Android não oferece suporte a Java 8 no momento. Portanto, essa solução só é possível em outros contextos.
fonte
Common
classe e permitiria que você fornecesse um URL substituto e manteria as responsabilidades juntas.Optional.of
implica que o valor não é nulo e, portanto,orElseGet
é desnecessário. Você deve usarOptional.ofNullable
neste caso.Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); if (drawable == null) { drawable = getRandomDrawable(); }
O
equals()
método verifica a igualdade de valor , o que significa que ele compara o conteúdo de dois objetos. Comonull
não é um objeto, isso falha ao tentar comparar o conteúdo do seu objeto com o conteúdo denull
.O
==
operador verifica a igualdade de referência , o que significa que verifica se os dois objetos são realmente o mesmo objeto . Isso não exige que os objetos realmente existam; dois objetos inexistentes (null
referências) também são iguais.fonte
Eu uso esta abordagem:
if (null == drawable) { //do stuff } else { //other things }
Desta forma, descobri que melhora a legibilidade da linha - conforme leio rapidamente um arquivo de origem, posso ver que é uma verificação nula.
Com relação ao motivo pelo qual você não pode chamar
.equals()
um objeto que pode sernull
; se a referência de objeto que você tem (ou seja, 'drawable') é de fatonull
, ela não aponta para um objeto na pilha. Isso significa que não há nenhum objeto no heap no qual a chamada paraequals()
possa ser bem-sucedida.Boa sorte!
fonte
faça você mesmo
private boolean isNull(Object obj) { return obj == null; }
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); if (isNull(drawable)) { drawable = getRandomDrawable(); }
fonte
drawable.equals(null)
A linha acima chama o método "equals (...)" no objeto drawable.
Então, quando drawable não é nulo e é um objeto real, tudo vai bem, pois chamar o método "equals (null)" retornará "false"
Mas quando "drawable" é nulo, isso significa chamar o método "equals (...)" em um objeto nulo, significa chamar um método em um objeto que não existe, por isso lança "NullPointerException"
Para verificar se um objeto existe e não é nulo, use o seguinte
if(drawable == null) { ... ... }
Na condição acima, estamos verificando se a variável de referência "drawable" é nula ou contém algum valor (referência a seu objeto), portanto, não lançará uma exceção no caso de drawable ser nulo como verificação
null == null
é válido.
fonte
if (yourObject instanceof yourClassName)
irá avaliarfalse
seyourObject
énull
.fonte
Provavelmente é um pouco mais eficiente capturar um NullPointerException. Os métodos acima significam que o tempo de execução está verificando ponteiros nulos duas vezes.
fonte
if x == null
solução de check-in duplo ?Use google guava libs para lidar com is-null-check (atualização do deamon)
Drawable drawable = Optional.of(Common.getDrawableFromUrl(this, product.getMapPath())).or(getRandomDrawable());
fonte
Optional
hoje.Só para dar algumas idéias ao desenvolvedor de código Java do oracle :-)
A solução já existe em .Net e é muito mais legível!
Em Visual Basic .Net
Drawable drawable = If(Common.getDrawableFromUrl(this, product.getMapPath()) ,getRandomDrawable() )
Em C #
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath() ?? getRandomDrawable();
Essas soluções são poderosas como solução Java opcional (a string padrão só é avaliada se o valor original for nulo) sem usar a expressão lambda, apenas ao adicionar um novo operador.
Apenas para ver rapidamente a diferença com a solução Java, adicionei as 2 soluções Java
Usando opcional em Java
Drawable drawable = Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath())) .orElseGet(() -> getRandomDrawable());
Usando {} em Java
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); if (drawable != null) { drawable = getRandomDrawable(); }
Pessoalmente, gosto de VB.Net mas prefiro
?? C#
ouif {}
solução em Java ... e você?fonte