Disposición de reglas de FindBugs: mala práctica
Cree una entrada de archivo jar vacía
Llame al método putNextEntry() y llame al método closeEntry() tan pronto como se escriba la nueva entrada del archivo jar. Esto dará como resultado que la entrada JarFile esté vacía.
Crear una entrada de archivo zip vacía
Al escribir una nueva entrada de archivo zip, llame al método putNextEntry() para llamar inmediatamente al método closeEntry(). Esto hará que la entrada ZipFile esté vacía.
El método Equals no debe hacer ninguna suposición sobre el tipo de sus parámetros
El método equals(Object o) no puede hacer ninguna suposición sobre el tipo de parámetro o. Compara este objeto con el objeto especificado. El resultado es verdadero si y sólo si el argumento no es nulo y representa un objeto del mismo tipo que este objeto.
Los objetos aleatorios se crean y usan solo una vez
Los objetos creados aleatoriamente se usan una vez y se descartan.
Compruebe el signo de las operaciones bit a bit.
Compruebe si el operador de la broca está funcionando correctamente.
La clase implementa Cloneable, pero no define ni usa el método de clonación
La clase implementa la interfaz Cloneable, pero no define ni usa el método de clonación. Por convención, las clases que implementan esta interfaz deben anular Object.clone (protegido) con métodos * * * públicos para obtener más información sobre cómo anular este método.
El método clone no llama a super.clone()
La clase no final define el método clone(), pero no llama al método super.clone(). Por ejemplo: B se extiende desde A. Si el método de clonación en B llama a spuer.clone(), pero el clon en A no llama a spuer.clone(), entonces el tipo de resultado será inexacto. Es necesario llamar al método spuer.clone() en el método de clonación de A.
La clase define clone(), pero no implementa Cloneable
El método clone está definido en la clase, pero no implementa la interfaz Cloneable.
La clase abstracta define el método covariante compareTo()
La clase abstracta define varios métodos compareTo(). Es correcto anular el método compareTo en Comparable. son de tipo Objeto.
El método covariante compareTo() está definido
Varios métodos compareTo() están definidos en la clase. Es correcto anular el método compareTo en Comparable. Los parámetros de estos métodos pertenecen al tipo Objeto.
Los métodos pueden generar excepciones
Los métodos pueden generar excepciones.
Los métodos pueden ignorar las excepciones
Los métodos pueden ignorar las excepciones.
No utilice removeAll para borrar una colección.
No utilice el método removeAll para borrar una colección.
Los cargadores de clases solo se pueden crear en bloques doPrivileged
Los cargadores de clases solo se pueden construir en cuerpos de métodos especiales.
El método llama a System.exit(...)
Llame a la instrucción System.exit(...) y considere usar RuntimeException en su lugar.
El método llama al método peligroso runFinalizersOnExit
El método System.runFinalizersOnExit o Runtime.runFinalizersOnExit se llama en el método porque hacerlo es peligroso.
¡Utilice == o para comparar parámetros de cadena! =
Usa = = o! Métodos para comparar parámetros de tipo cadena
La clase abstracta define el método covariante igual a()
La clase abstracta define el método * * * variante compareTo().
Equals busca operandos incompatibles
El método equals busca operaciones inconsistentes. Las dos clases están básicamente en una relación padre-hijo y se llama al método igual para determinar si los objetos son iguales.
La clase define compareTo(...) y usa Object.equals()
La clase define el método compareTo(...), pero usa Object.equals() método.
El método igual falla para los subtipos
Un método igual en una clase puede ser roto por un método en una subclase. Cuando utilice un juicio como Foo.class == o.getClass(), puede considerar usar this.getClass() == o.getClass() en su lugar.
Se define el método covariante igual ()
Se definen múltiples métodos iguales en la clase. La forma correcta es anular el método igual en Objeto y su parámetro es un objeto de tipo Objeto.
El finalizador vacío debe eliminarse
El método finalize() vacío debe eliminarse.
Tipo no marcado en llamada genérica
Se utiliza un tipo no marcado en una llamada genérica.
La clase define equals(), pero no hashCode()
Este método define el método equals, pero no define el método hashCode.
La clase define hashCode(), pero no es igual a ()
La clase define el método hashCode, no el método igual.
La clase define equals() y usa Object.hashCode()
La clase anula el método equals, no anula el método hashCode y usa el método hashCode del objeto.
La clase hereda equals() y usa Object.hashCode()
La subclase hereda el método equals de la clase principal, pero usa el método hashCode del objeto.
La superclase usa la subclase durante la inicialización
Antes de inicializar la clase principal, la subclase usa una instancia del objeto de la clase principal.
Captura sospechosa de IllegalMonitorStateException
Captura sospechosa de IllegalMonitorStateException
Creación de instancias innecesaria de una clase que solo proporciona métodos estáticos
Crear objetos de instancia usando métodos estáticos. Al llamar a un método estático, simplemente use el nombre de la clase + el nombre del método estático.
El método next() del iterador no puede lanzar NoSuchElementException
El método next del iterador no puede lanzar NoSuchElementException.
Almacenar objetos no serializables en HttpSession
Guardar objetos discontinuos en el objeto HttpSession.
Los campos de clases inmutables deben ser definitivos
Los campos de clases inmutables deben ser finales.
Un método con un tipo de retorno booleano devuelve nulo explícito
Un método con un valor de retorno booleano devuelve nulo directamente, lo que provocará una excepción de puntero nulo.
El método equals() no comprueba los parámetros vacíos
Cuando se llama al método equals en una variable, no se juzga si está vacía.
El método toString puede devolver nulo.
El método ToString puede devolver nulo.
Los nombres de las clases deben comenzar con una letra mayúscula.
Los nombres de las clases deben comenzar con una letra mayúscula.
La clase no se deriva de excepción, incluso si se nombra de esa manera
Una clase cuyo nombre contiene excepción, pero no es una subclase de la clase Exception, puede causar confusión.
Nombres de métodos confusos
Nombres de métodos confusos
Los nombres de los campos deben comenzar con letras minúsculas
Los campos no finales deben seguir mayúsculas Camel principio de denominación.
Uso de un identificador como palabra clave en versiones posteriores de Java
Verifique que sea una palabra clave reservada de Java.
Usar identificadores como palabras clave en versiones posteriores de Java
Verifique que sea una palabra clave en Java
Los nombres de los métodos deben estar en letras minúsculas Inicio
Los nombres de los métodos comienzan con una letra minúscula.
Los nombres de las clases no deben ocultar el nombre simple de la interfaz de implementación.
Las clases que implementan la misma interfaz no pueden usar el mismo nombre, incluso si están en paquetes diferentes.
Los nombres de las clases no deben ocultar el nombre simple de la superclase
Las clases hijas que heredan la misma clase padre no pueden usar el mismo nombre, incluso si están en paquetes diferentes.
Nombres de métodos muy confusos (pero probablemente intencionales)
Es fácil confundir los nombres de métodos; por ejemplo, el nombre de un método usa mayúsculas y minúsculas para distinguir dos métodos diferentes.
El método no anula el método en la superclase debido a un paquete de parámetros incorrecto.
El método en la superclase no se puede anular correctamente porque el error hace referencia a una clase con el mismo nombre de clase en un objeto de paquete diferente.
Es posible que el método no pueda cerrar el recurso de la base de datos.
Es posible que no se pueda cerrar la conexión de datos en el método.
Es posible que el método no cierre la secuencia.
Es posible que el método no cierre la secuencia.
Es posible que el método no cierre la secuencia en caso de excepción
Puede ocurrir una excepción en el método al cerrar la secuencia.
Comparaciones de referencias sospechosas con constantes
Cuando son objetos de diferentes tipos, use el método igual para comparar si sus valores son iguales, en lugar de usar el método ==. Por ejemplo, las dos comparaciones son java.lang.integer y java.lang.float.
El método ignora el resultado de InputStream.read()
El método InputStream.read ignora los múltiples caracteres devueltos. Si el resultado no se verifica, la solicitud del usuario lee varios caracteres. no será correcto.
El método ignora el resultado de InputStream.skip()
El método InputStream.skip() ignora los múltiples caracteres devueltos. Si el resultado no se verifica, no puede manejar correctamente cómo. muchos caracteres que el usuario omitió. Solicitudes de caracteres.
El método ignora el valor de retorno de la excepción
El método ignora la información de excepción del valor de retorno.
El inicializador estático crea una instancia antes de que se asignen todos los campos finales estáticos.
Utilice la inicialización estática para crear una instancia de una clase antes de que se asignen todos los campos finales estáticos.
Los valores no serializables se almacenan en campos de instancia de una clase serializable
Los valores no serializables se almacenan en campos no serializables que se declaran como serializables.
El comparador no implementa la serialización
La interfaz del comparador no implementa la interfaz serializable.
Clase interna serializable
Clase interna serializable
serialVersionUID no es la versión final
SerialVersionUID no es la versión final.
La clase es serializable, pero su superclase no define un constructor vacío
Cuando la subclase se serializa, la clase principal no proporciona un constructor vacío.
La clase es externalizable pero no define un constructor vacío
La clase de instancia externalizada no define un constructor vacío.
El método readResolve debe declararse con el tipo de retorno de Objeto.
ReadResolve lee una instancia de una clase de la secuencia. Este método debe declarar que devuelve un objeto de tipo Objeto.
Un campo transitorio que no se establece mediante deserialización.
Los campos que no requieren deserialización no se declaran transitorios.
La clase es serializable, pero serialVersionUID no está definido
Una clase implementa la interfaz Serializable, pero no define una variable de tipo serialVersionUID. El tiempo de ejecución de serialización está asociado con cada clase serializable mediante un número de versión llamado serialVersionUID, que se utiliza para verificar que el remitente y el receptor del objeto serializado cargaron las clases compatibles con la serialización. Si el serialVersionUID de la clase del objeto cargado por el receptor es diferente del número de versión de la clase del remitente correspondiente, la deserialización dará como resultado una InvalidClassException. Una clase serializable puede declarar explícitamente su propio serialVersionUID declarando un campo llamado "serialVersionUID" (que debe ser un campo largo estático y final).
Si la clase está extendida, usar GetResource puede no ser seguro.
Cuando una subclase hereda una clase, no use this.getClass(). getResource(...) para obtener el recurso.
FindBugs: introducción y uso
Clasificación de reglas FindBugs: corrección
Clasificación de reglas FindBugs: estilo y esquiva
Clasificación de reglas FindBugs: malicioso vulnerabilidades de código
Clasificación de reglas de FindBugs: corrección multiproceso
Clasificación de reglas de FindBugs: seguridad y experimentación
Clasificación de reglas de FindBugs: rendimiento
Disposición de reglas FindBugs: internacionalización
Durante el proceso de integración de los siguientes artículos, se descubrieron y se corrigieron algunos errores de traducción. Gracias al autor del siguiente artículo.
Nota de uso de FindBugs
Clasificación de reglas de FindBugs
Explicación detallada del detector FindBugs.
Explicación detallada de los defectos de Findbugs y tabla comparativa de códigos en inglés