Pregunta

Al hacer cheques nulos en el código Java, y usted lanza ilegalargumentExcepciones para valores nulos, ¿qué tipo de plantilla de mensaje usa?

Tendemos a usar algo como esto

public User getUser(String username){
   if (username == null){
     throw new IllegalArgumentException("username is null");   
   }
   // ...
}

Qué es mejor: "es nulo" o "fue nulo", y ¿por qué?

Para mí "es nulo" se siente más natural.

¿Fue útil?

Solución

Desde el Exception se lanza debido a una verificación de condición previa fallida, creo que en lugar de simplemente declarar un hecho, debe indicar el requisito Eso fue violado.

Es decir, en lugar de decir "username is null", decir "username should not be null".


Sobre el uso de bibliotecas para verificaciones de condición previa

Como consejo, puede usar una de las muchas bibliotecas diseñadas para facilitar los controles de condición previa. Muchos usos de código en guayaba com.google.common.base.Preconditions

Métodos estáticos simples para llamarse al comienzo de sus propios métodos para verificar los argumentos y el estado correctos. Esto permite construcciones como

 if (count <= 0) {
   throw new IllegalArgumentException("must be positive: " + count);
 }

ser reemplazado por el más compacto

 checkArgument(count > 0, "must be positive: %s", count);

Más directamente relevante aquí es que tiene checkNotNull, que le permite simplemente escribir:

  checkNotNull(username, "username should not be null");

Tenga en cuenta cómo se lee el código anterior, con el mensaje detallado que indica explícitamente el requisito Eso fue violado.

La alternativa de declarar hechos es más incómoda:

 // Awkward!
 checkArgument(count > 0, "is negative or zero: %s", count);
 checkNotNull(username, "username is null");

Además, esto también es potencialmente menos útil, ya que el cliente ya puede ser consciente del hecho, y la excepción no les ayuda a descubrir qué requisitos son.


En IllegalArgumentException VS NullPointerException

Mientras su código original lanza IllegalArgumentException en null argumentos, guayaba Preconditions.checkNotNull lanza NullPointerException en cambio.

Esto está de acuerdo con la guía establecida por la API:

NullPointerException: Las aplicaciones deben lanzar instancias de esta clase para indicar otros usos ilegales del null objeto.

Además, aquí hay una cita de Java 2da edición efectiva: Artículo 60: favorecer el uso de excepciones estándar:

Podría decirse que todas las invocaciones de métodos erróneos se reducen a un argumento ilegal o un estado ilegal, pero otras excepciones se utilizan de manera estándar para ciertos tipos de argumentos ilegales y estados. Si pasa una persona que llama null En algún parámetro para el cual se prohíben los valores nulos, la convención dicta que NullPointerException ser arrojado en lugar de IllegalArgumentException.

Otros consejos

es nulo, ya que el argumento todavía es nulo.

Sin embargo, ¿por qué no simplemente lanzar una NullPointerException sin un mensaje?

Sugeriría decir

  if (userName == null) {
     throw new IllegalArgumentException("username == null");
   }

Como esto es tan fatal que un programador debe mirarlo de todos modos. Referir el fragmento del código ofensivo en el mensaje de excepción es lo que puedo imaginar.

Me inclinaría a escribir esto:

public User getUser(String username) {
   if (username.length() == 0) {
       throw new IllegalArgumentException("username is empty");   
   }
   // ...
}

Esto mata a dos pájaros de un solo piedra. Primero, detecta el caso donde el nombre de usuario es una cadena vacía, que (por el argumento) supongo que es un error. Segundo, si el parámetro es null Intentando enviar el length la llamada dará un NullPointerException.

Para que el registro, el esperado excepción para lanzar para un inesperado null es NullPointerException. Si su razón principal para no usarlo es que los NPE generalmente no tienen un mensaje, codifíquelo así:

public User getUser(String username){
   if (username == null){
       throw new NullPointerException("username is null");   
   }
   if (username.length() == 0) {
       throw new IllegalArgumentException("username is empty");   
   }
   // ...
}

¿Por qué usar NPE aquí? Porque los NPE casi siempre indican un diferente tipo de problema a otro tipo de error de validación de argumentos; por ejemplo, una celda de campo o matriz que no se ha inicializado o un valor "opcional" que no se maneja correctamente.

Finalmente a la pregunta:

Qué es mejor : "is null" o "was null", ¿y por qué?

Esta es una cuestión de opinión, pero escribiría "is null".

  • Porque el mensaje informa al estado cuando se lanzó la excepción.
  • Porque es convencional hacerlo de esa manera.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top