tools style sonar quality guides google coding code java coding-style nullpointerexception code-readability

sonar - java code style



Con gracia evitando NullPointerException en Java (9)

Aquí está mi enfoque, sin embargo, necesita una clase PropertyUtil , pero solo se escribe una vez:

/** * Generic method to encapsulate type casting and preventing nullPointers. * * @param <T> The Type expected from the result value. * @param o The object to cast. * @param typedDefault The default value, should be of Type T. * * @return Type casted o, of default. */ public static <T> T getOrDefault (Object o, T typedDefault) { if (null == o) { return typedDefault; } return (T) o; }

El código del cliente puede hacer esto:

PropertyUtil.getOrDefault(obj.getAttribute("someAttr"), "").equals("true");

o, para una lista:

PropertyUtil.getOrDefault( genericObjectMap.get(MY_LIST_KEY), Collections.EMPTY_LIST ).contains(element);

O a un consumidor de Lista, que rechazaría el Objeto:

consumeOnlyList( PropertyUtil.getOrDefault( enericObjectMap.get(MY_LIST_KEY), Collections.EMPTY_LIST ) )

El valor predeterminado podría ser una impl del patrón de objeto nulo https://en.wikipedia.org/wiki/Null_Object_pattern

Considera esta línea:

if (object.getAttribute("someAttr").equals("true")) { // ....

Obviamente, esta línea es un error potencial, el atributo puede ser null y obtendremos una NullPointerException . Así que necesitamos refactorizarlo a una de dos opciones:

Primera opción:

if ("true".equals(object.getAttribute("someAttr"))) { // ....

Segunda opción:

String attr = object.getAttribute("someAttr"); if (attr != null) { if (attr.equals("true")) { // ....

La primera opción es torpe de leer pero más concisa, mientras que la segunda es clara en su intención, pero detallada.

¿Qué opción prefieres en términos de legibilidad?


En la segunda opción, puede aprovechar el cortocircuito en && :

String attr = object.getAttribute("someAttr"); if (attr != null && attr.equals("true")) { // ....


Es una muy buena pregunta. Usualmente uso el no agraciado

if (object.getAttribute("someAttr") != null && object.getAttribute("someAttr").equals("true")) { // ....

(y no lo usaré más)


Hay ciertas situaciones en las que el enfoque conciso se siente mal para comenzar pero efectivamente se vuelve idiomático. Este es uno de ellos; el otro es algo como:

String line; while ((line = bufferedReader.readLine()) != null) { // Use line }

¿Efectos secundarios en una condición? ¡Inconcebible! Excepto que es básicamente mejor que las alternativas, cuando reconoces el patrón particular.

Este patrón es similar: es tan común en Java que esperaría que cualquier desarrollador con experiencia razonable lo reconociera. El resultado es agradablemente conciso. (De manera divertida, a veces veo el código C # que usa el mismo idioma, innecesariamente: el operador de igualdad funciona bien con las cadenas en C #).

En pocas palabras: use la primera versión y familiarícese con ella.


Me gusta la opción 1 y diría que es lo suficientemente legible.

La opción 3 por cierto sería introducir un método getAttribute que tome un valor predeterminado como parámetro.


Siempre aspire a un código más corto, dado que ambos son funcionalmente equivalentes. Especialmente en casos como este donde no se sacrifica la legibilidad.


Siempre he usado

if ("true".equals(object.getAttribute("someAttr"))) { // ....

Porque aunque es un poco más difícil de leer, es mucho menos detallado y creo que es lo suficientemente legible para que te acostumbres a él muy fácilmente.


Tengo otra respuesta;

List<Map<String, Object>> group = jjDatabase.separateRow(db.Select("SELECT * FROM access_user_group WHERE user_id=1 ;"));

no hay "group_c80" como columna en ''access_user_group'' en mi base de datos, así que en get (0) .get ("group_c80") acuerdos de excepción de puntero nulo. Pero lo manejé a través del siguiente código:

for (int j = 1; j < 100; j++) { String rulId="0";//defult value,to privent null pointer exeption in group_c try { rulId = group.get(0).get("group_c" + j)).toString(); } catch (Exception ex) { ServerLog.Print( "Handeled error in database for " + "group_c" + (j < 10 ? "0" + j : j) +"This error handeled and mot efect in program"); rulId = "0"; }}


Util.isEmpty(string) - devuelve string == null || string.trim().isEmpty() string == null || string.trim().isEmpty() Util.notNull(string) devuelve "" si string == null , cadena de lo contrario. Util.isNotEmpty(string) devuelve! Util.isEmpty(string)

Y tenemos una convención de que para cadenas, Util.isEmpty(string) significa semánticamente verdadero y Util.isNotEmpty(string) significa semánticamente falso.