Pregunta

Tengo una función que devuelve un número de identificación si el argumento existe en la base de datos.Si no, devuelve nulo.¿Esto está pidiendo una excepción de puntero nulo?Los números de identificación negativos no están permitidos, pero pensé que sería más claro tener argumentos inexistentes que devuelvan un valor nulo en lugar de un código de error como -1.¿Qué opinas?

private Integer tidOfTerm(String name) throws SQLException {
    String sql = "SELECT tid FROM term_data WHERE name = ?";
    PreparedStatement prep = conn.prepareStatement(sql);
    prep.setString(1, name);
    ResultSet result = prep.getResultSet();

    if (result.next()) {
        return result.getInt("tid");
    }

    return null; // TODO: is this begging for a null pointer exception?
}
¿Fue útil?

Solución

Esto es perfectamente legal. Si se quiere evitar una NPE, lanzar una excepción personalizada. Pero no se devolverá un número negativo. Si la persona que llama no comprueba el valor de retorno, siempre tendrá un problema. Pero hacer false de cálculo (ya que el resultado es, por ejemplo, multiplicar por -1) es sin duda más difícil de depurar que una excepción uncatched.

Otros consejos

Devolución de una null en el caso de una búsqueda que no reconocen un resultado es un método normal de representar no existencia. Me volvería a elegir en este caso. (Métodos de búsqueda de las clases estándar de Java mapa son un ejemplo para el uso de null en caso de que el mapa no contiene una clave.)

En cuanto a la devolución de un valor especial para la Identificación, yo sólo se proponen hacer que si el sistema ya contiene valores especiales repesenting especial de identificación.

Otra posibilidad oído a menudo es lanzar una excepción en este caso. No es prudente sin embargo a excepciones por el uso de pasar del estado, por lo que yo no haría eso.

Creo que es legítimo para volver nula en este caso. Sólo asegúrese de que la intención está documentado correctamente.

La devolución de un valor negativo en este caso estaría bien, pero no es una solución todo-en torno. ¿Qué pasa si los valores negativos se les permitió en el PP?

Editar : Quiero añadir una palabra sobre las discusiones relacionadas en cuanto a SO nulos que regresan o listas vacías (o matrices). Estoy a favor de volver listas vacías o matrices en lugar de nulo, pero el Contexto es diferente. Al intentar obtener una lista, es típicamente parte de un objeto padre, y que en realidad tiene sentido que el objeto principal de tener una lista vacía en lugar de una referencia nula. En este caso, tiene un significado nulo (= no encontrado) y no hay ninguna razón para evitar volver a él.

espero que esto no es un método real para ti. Usted no se cierre de los estados o conjunto de resultados en el ámbito de método.

  • No utilice un código de error! ¿Qué valor es el error? nunca se convertirá en un valor de retorno legal? Nada de won.

  • Null no es bueno. La mayoría del código que llama tiene que hacer un cheque si no nulo para el resultado. Y algunas veces el SELECT puede devolver null. En caso de que se maneja diferente que ninguna fila?

  • lanzar una excepción como NoSuchElementException en lugar de la nula rentabilidad. Es una excepción no se controla, la persona que llama puede manejarlo o dejarla pasar. Y si la persona que llama quiere manejar, el intento de captura no es más compleja que una si no es nulo.

Sugiero se tiene en cuenta el patrón opción.

El patrón opción actúa como una envoltura alrededor de su tipo devuelto, y define dos casos especiales: option.none () y option.some (). De esa manera, siempre se conoce su tipo devuelto (una opción), y se puede comprobar si tiene un valor en el objeto devuelto Opción utilizando métodos como option.isSome () y option.isNone ().

De esta manera, se puede garantizar que no tiene ningún nulos sin marcar.

Por supuesto, todo esto viene a costa de la complejidad del código adicional.

Para obtener más información sobre el tipo de opción, ver aquí ( código Scala, pero mismo principal)

No, no lo hará. Sólo se lanzará una NPE si lo hace operaciones en él después como si se trata de una primitiva y sin nullchecking ella. P.ej. i++ y así sucesivamente. Su ejemplo es válido (esperar de que el propio código JDBC tiene una fuga de recursos). Si no necesita el id real, entonces se puede, por otro lado también acaba de regresar de una boolean.

Podría causar un gran problema para los usuarios novatos. Buenos codificadores reconocerán que si el nombre es posible que se devuelva null entonces no válido. Habiendo dicho que lo más normal es echar algo de exception.

Podría ser difícil en combinación de Autoboxing. Si estoy haciendo esto:

final int tid = tidForTerm("term");

Y "término" no existe, voy a conseguir un NPE, ya que Java intenta unboxing un entero (nulo) a un int primitivo.

Sin embargo, hay casos en los que es realmente bueno para su uso nula para los enteros. En las entidades que tienen valores int opcionales, por ejemplo, la población de una ciudad. En ese caso significaría nula, no hay información disponible.

Un problema interesante y un gran número de posibles soluciones:

  1. Crear un método HasArgument y requiere que los usuarios llamarlo, problema que esto puede ser un trabajo lento y dupplicate
  2. una excepción si un valor no está en la base de datos, sólo debe utilizarse si esto es inesperado
  3. Los valores de uso adicionales para indicar un retorno inválida, nula y los valores negativos trabajarían para usted, pero si no se controla que podrían causar problemas más adelante en el código.
  4. Método
  5. Vuelta un derivador con un isValid () y un getValue (), donde getValue () lanza una excepción cuando no es válido. Esto resuelve los problemas de 1 y 3, pero puede ser un poco demasiado Mutch.

Yo diría que la mejor solución depende del nombre de su método, y debe considerar el nombre de sus métodos tanto como si deben devolver un valor nulo o generar una excepción.

tidOfTerm implica para mí que se espera que el Término exista, por lo que descubrir que uno no existe debería generar una excepción.

Si el nombre del término está bajo el control de su propio código y no encontrarlo indica un error en su código o entorno, entonces es posible que desee lanzar una excepción IllegalArgumentException.

Si el argumento del nombre del término no está bajo su control y no encontrar un término válido es una situación perfectamente válida, entonces cambiaría el nombre de su método a algo como findTidForTermName dando un ligero indicio de que se va a realizar algún tipo de búsqueda y que, por tanto, existe la posibilidad de que la búsqueda no encuentre nada.

Estoy de acuerdo con los carteles. Entero es un envoltorio y como tal debe ser utilizado para los cálculos, conversiones, etc (que creo que está con la intención de hacer). No devuelva un valor nulo, utilice un número negativo ... que es un poco más elegante y que permite un mayor control. En mi humilde opinión.

Por favor, no escribir código que devuelve null. Esto significa que todos y cada llamada a su código de debe cheque por nula con el fin de ser robusto. Cada vez. Siempre.

Tenga en cuenta el retorno de una lista en lugar que contiene varios valores de retorno, lo que podría ser cero.

Sí, debe ser la causa de un NPE y sí que debe ponerse al que, en el método de llamada (o algún otro lugar conveniente). La razón más probable por el método devolverá NULL es cuando no hay registros y la forma correcta de mango que está por lanzar una excepción. Y la excepción perfecta para decirle a alguien que no tiene lo que pidió es NPE.

Volviendo un código de error (por ejemplo, -1) no es bueno porque:

a) si hay muchos errores que desea manejar (por ejemplo, no puede leer DB, puede leer DB, pero el objeto no existe en la base de datos, encontraron objeto, sino algo que está dañado, etc), a continuación, devolver un código de error no distingue entre los tipos de errores.

b) en el futuro si se convierte en un -1 Identificación del término legal, entonces será difícil cambiarlo (si tiene que usar -1, entonces (EDIT: en C) por lo menos hacer ERRORCODE #define -1 y el uso ERRORCODE todas partes)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top