vacio - validar si un objeto es null java
¿La mejor manera de verificar valores nulos en Java? (16)
El Método 4 es de lejos el mejor ya que indica claramente lo que sucederá y utiliza el mínimo de código.
El Método 3 es simplemente incorrecto en todos los niveles. Usted sabe que el artículo puede ser nulo, por lo que no es una situación excepcional, es algo que debe verificar.
El Método 2 simplemente lo está haciendo más complicado de lo necesario.
El Método 1 es solo el método 4 con una línea adicional de código.
Antes de llamar a una función de un objeto, necesito verificar si el objeto es nulo, para evitar arrojar una NullPointerException
.
¿Cuál es la mejor manera de hacerlo? He considerado estos métodos.
¿Cuál es la mejor práctica de programación para Java?
// Method 1
if (foo != null) {
if (foo.bar()) {
etc...
}
}
// Method 2
if (foo != null ? foo.bar() : false) {
etc...
}
// Method 3
try {
if (foo.bar()) {
etc...
}
} catch (NullPointerException e) {
}
// Method 4 -- Would this work, or would it still call foo.bar()?
if (foo != null && foo.bar()) {
etc...
}
El método 4 es mi método preferido. El cortocircuito del operador && hace que el código sea más legible. El Método 3, Capturar NullPointerException, está mal visto la mayor parte del tiempo cuando una simple comprobación nula sería suficiente.
Si controlas que se llame a la API, considera usar la clase opcional de Guava
Más información aquí . Cambie su método para devolver un Optional<Boolean>
lugar de un Boolean
.
Esto informa al código de llamada que debe tener en cuenta la posibilidad de nulo, llamando a uno de los métodos útiles en Optional
Tu última propuesta es la mejor.
if (foo != null && foo.bar()) {
etc...
}
Porque:
- Es más fácil de leer
- Es seguro: foo.bar () nunca se ejecutará si foo == null.
- Evita las malas prácticas, como la captura de NullPointerExceptions (la mayoría de las veces debido a un error en tu código)
- Debería ejecutarse tan rápido o incluso más rápido que otros métodos (aunque creo que debería ser casi imposible notarlo).
Yo diría que el método 4 es la expresión más general del código que he visto. Pero esto siempre se siente un poco mal para mí. Asume que foo == null es lo mismo que foo.bar () == false.
Eso no siempre me parece correcto.
El método 4 es el mejor.
if(foo != null && foo.bar()) {
someStuff();
}
usará la evaluación de cortocircuito , lo que significa que finaliza si la primera condición de un logical AND
es falsa.
- No atrape
NullPointerException
. Esa es una mala práctica. Es mejor asegurarse de que el valor no sea nulo. - El método # 4 funcionará para usted. No evaluará la segunda condición, porque Java tiene un cortocircuito (es decir, las condiciones posteriores no se evaluarán si no cambian el resultado final de la expresión booleana). En este caso, si la primera expresión de un AND lógico se evalúa como falsa, las expresiones subsiguientes no necesitan ser evaluadas.
En Java 7 , puede usar Objects.requireNonNull()
. Agregue una importación de la clase Objects
de java.util
.
public class FooClass {
//...
public void acceptFoo(Foo obj) {
//If obj is null, NPE is thrown
Objects.requireNonNull(obj).bar(); //or better requireNonNull(obj, "obj is null");
}
//...
}
Como otros han dicho, # 4 es el mejor método cuando no se usa un método de biblioteca. Sin embargo, siempre debe poner null en el lado izquierdo de la comparación para asegurarse de no asignar accidentalmente null a foo en caso de error tipográfico. En ese caso, el compilador captará el error.
// You meant to do this
if(foo != null){
// But you made a typo like this which will always evaluate to true
if(foo = null)
// Do the comparison in this way
if(null != foo)
// So if you make the mistake in this way the compiler will catch it
if(null = foo){
// obviously the typo is less obvious when doing an equality comparison but it''s a good habit either way
if(foo == null){
if(foo = null){
si no tiene acceso a la biblioteca commons apache, lo siguiente probablemente funcione bien
if(null != foo && foo.bar()) {
//do something
}
En Java 8, la mejor forma de comprobar si hay nulo es:
Objects.isNull(obj) //returns true if the object is null
Objects.nonNull(obj) //returns true if object is not-null
if(Objects.nonNull(foo) && foo.something()) // Uses short-circuit as well. No Null-pointer Exceptions are thrown.
Aparte de esto ... También puedes ir con la clase opcional de Guava
Reduce los errores tipológicos como (obj=null)
que siempre devuelve true
como se discutió en las respuestas anteriores.
Podemos usar el método estático Object.requireNonNull de la clase Object. La implementación está debajo
public void someMethod(SomeClass obj) {
Objects.requireNonNull(obj, "Validation error, obj cannot be null");
}
El último y el mejor. es decir, LÓGICO Y
if (foo != null && foo.bar()) {
etc...
}
Porque en lógica &&
no es necesario saber cuál es el lado derecho, el resultado debe ser falso
Prefiero leer: cortocircuito operador lógico Java
Código simple de una línea para verificar nulo:
namVar == null ? codTdoForNul() : codTdoForFul();
También puede usar StringUtils.isNoneEmpty("")
para que la verificación sea nula o esté vacía.
Si va a verificar con doble igual "==", entonces marque nulo con objeto ref como
if(null == obj)
en lugar de
if(obj == null)
porque si escribe mal single igual if (obj = null) devolverá true (la asignación del objeto devuelve success (que es ''verdadero'' en valor).