Pregunta

Me estoy quedando en esta situación donde necesito analizar una String en un int y no sé qué hacer con el NumberFormatException. El compilador no se queja cuando no lo captura, pero sólo quiero para asegurarse de que estoy manejando esta situación correctamente.

private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        i = 0;
    }
    return i;
}

Sólo quiero simplificar mi código como este. El compilador no tiene un problema con él, pero las matrices hilo en el NumberFormatException.

private int getCurrentPieceAsInt() {
    int i = 0;
    i = Integer.parseInt(this.getCurrentPiece());
    return i;
}

Google CodePro quiere que ingrese la excepción de alguna manera, y estoy de acuerdo que esta es la mejor práctica.

private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        i = 0;
        e.printStackTrace();
    }
    return i;
}

Quiero que este método devuelva 0 cuando la pieza actual no es un número o no se puede analizar. Cuando no cojo el NumberFormatException explícitamente, ¿no se asigne la variable i? ¿O hay algún valor predeterminado que vuelve Integer.parseInt()?

estilo

General dice que si cojo una excepción, que debería entrar en alguna parte. No quiero a registrarlo. Es el funcionamiento normal de esta excepción sea lanzada en ocasiones, que también no se sienta bien conmigo. No puedo encontrar una función, sin embargo, lo que me dirá si Integer.parseInt() lanzará una excepción. Así que mi único curso de acción parece ser que acaba de llamarlo y detectar la excepción.

El Javadoc para parseInt no ayuda mucho.

Aquí están las preguntas específicas que me gustaría saber:

  • ¿Hay un método que puedo llamar que me diga si va a lanzar una Integer.parseInt() NumberFormatException antes de llamar? Entonces yo no tendría ningún problema en el registro de esto, ya que nunca debe suceder.
  • Si simplemente no detectar la excepción, no conseguirá asignado el valiable? A continuación, me limitaré a inicializarlo con el valor que quiero cuando no es un número y no detectar la excepción.
  • ¿Hay una manera de marcar la excepción de alguna manera explícita que no me importa al respecto? Estoy pensando que esto sería algo similar a AWTEvent.consume(). Si es así, entonces voy a hacer esto para que Google CodePro no ve esto como "no talado".
¿Fue útil?

Solución

  • ¿Hay un método que puedo llamar que me diga si Integer.parseInt () lanzará una NumberFormatException antes de llamar? Entonces yo no tendría ningún problema en el registro de esto, ya que nunca debe suceder.

Lamentablemente, no. Al no menos importante en el núcleo de la API de Java. Es fácil escribir uno, sin embargo -. Acaba de modificar el siguiente código

  • Si simplemente no detectar la excepción, no conseguirá asignado el valiable? A continuación, me limitaré a inicializarlo con el valor que quiero cuando no es un número y no detectar la excepción.

Si no se captura la excepción a continuación, la pila será descansar hasta que llega a un bloque catch que se encargará de ella, o que va a relajarse por completo y detener el hilo. será, de hecho, no se puede asignar la variable pero esto no es exactamente lo que quiere.

  • ¿Hay una manera de marcar la excepción de alguna manera explícita que no me importa al respecto? Estoy pensando que esto sería algo similar a AWTEvent.consume (). Si es así, entonces voy a hacer esto para que Google CodePro no ve esto como "no talado".

Puede haber una manera de contar CodePro hacer caso omiso de esta advertencia en particular. Ciertamente, con herramientas como FindBugs y Checkstyle puede desactivar las advertencias en lugares específicos. (EDIT:. @Andy ha señalado cómo hacer esto)

Sospecho que lo que quiere es algo así como el paquete Commons Lang mencionado por @daveb. Es bastante fácil de escribir una función de este tipo:

int parseWithDefault(String s, int def) {
    try {
        return Integer.parseInt(s);
    }
    catch (NumberFormatException e) {
        // It's OK to ignore "e" here because returning a default value is the documented behaviour on invalid input.
        return def;
    }
}

Otros consejos

No NumberUtils.toInt (String, int) en Commons lang que hacer exactamente lo que quiere.

NumberUtils.toInt("123", 42) ==> 123
NumberUtils.toInt("abc", 42) ==> 42
* Is there a way to mark the exception somehow explicitly that I don't care about it? I'm thinking this would be something similar to AWTEvent.consume(). If so, then I will do this so that Google CodePro doesn't see this as "unlogged".

Sí, puede desactivar localmente una regla de auditoría CodePro de una línea de código:

http://code.google.com/javadevtools/ CodePro / doc / características / auditoría / locally_disabling_audit_rules.html

Dicho esto, no se requiere necesariamente para incluir el registro de diagnóstico en cada bloque catch excepción. A veces, la mejor acción es tomar un curso predeterminado. En algún momento es para interactuar con el usuario. Depende.

Cree su propio método de conveniencia para el presente y futuro uso:

public static int parseInt(final /*@Nullable*/ String s, final int valueIfInvalid) {
    try {
        if (s == null) {
            return valueIfInvalid;
        } else {
            return Integer.parseInt(s);
        }
    } catch (final NumberFormatException ex) {
        return valueIfInvalid;
    }
}

¿Hay un método que puedo llamar que me diga si Integer.parseInt () lanzará una NumberFormatException antes de llamar? Entonces yo no tendría ningún problema en el registro de esto, ya que nunca debe suceder.

No es que yo sepa. Tenga en cuenta que si lo hubiera, es probable que terminan analizar el valor dos veces (una vez para validar y analizarlo). Tengo entendido que quiere evitar la excepción, pero en este caso, esta es la captura de la excepción es el lenguaje estándar en Java y no proporciona otra (al menos que yo sepa).

Si simplemente no detectar la excepción, no conseguirá asignado el valiable? A continuación, me limitaré a inicializarlo con el valor que quiero cuando no es un número y no detectar la excepción.

Debe detectar la excepción (incluso si no hace nada) o que se escape el bloque y tirar hacia arriba a través de la pila.

¿Hay una manera de marcar la excepción de alguna manera explícita que no me importa al respecto? Estoy pensando que esto sería algo similar a AWTEvent.consume (). Si es así, entonces voy a hacer esto para que Google CodePro no ve esto como "no talado".

No sé de ninguna. Me gustaría utilizar el método de conveniencia anterior (tengo algo similar en una pequeña colección de utilidades generales que tengo disponibles para su uso en mis todos los proyectos).

No sería registrar si es verdaderamente una condición normal que se está manejando. No estoy familiiar con Google CodePro, pero yo espero que haya una manera de suprimir la advertencia, por ejemplo, algún tipo de @SuppressWarnings ( "XXX") anotación / palabra clave.


Editar: Yo quería señalar estos comentarios en los comentarios a continuación

Este enfoque todavía no maneja la excepción. Es una mala forma de capturar una excepción y no hacer nada con él. Esto es por lo que estoy buscando una mejor solución

.

... La excepción (la situación) está siendo manejado devolviendo el indicado valueIfInvalid. La "mala forma" se está refiriendo a la mala práctica de ciegamente y sin pensar, escribir bloques de captura vacíos y nunca volver a realmente tener en cuenta y dirección el caso. Si el situación de excepción se considera y hace lo correcto para la situación ( incluso si lo correcto es no hacer nada ), entonces usted "ha manejado" la excepción .

Se debe detectar la excepción como lo están haciendo. Es molesto, pero el mejor enfoque.

No existe un método API Java que devolverá 0 cuando la cadena no es un int válida.

Cuando la cadena no es un entero, una excepción será lanzada de manera variable int no se establecerá a menos que coger la excepción, ya que está haciendo.

Si no está claro cómo se debe manejar la situación del comprador, no debe coger y dejar que la persona que llama mucho con él en su lugar. Si sabe cómo debe manejarse sólo debe hacer eso. Inicio de sesión puede no ser necesaria o muy útil en este caso.

Registro de una excepción es más útil si usted no sabe cómo manejar la excepción y que está dejando a la persona que lee los registros.

Su primer bloque de código es correcto. i no se convierte implícitamente a 0 cuando se produce una excepción y hay que coger esa excepción. Configuración i a 0 catch interior es correcta; A pesar de que sólo tiene que sustituir i = 0; con return 0;. No se puede evitar la gestión de excepciones en este caso.

Para aclarar, puede utilizar la siguiente:

private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        // log that an exception occured if it's needed
        return 0;
    }
    return i;
}

Como otros han mencionado, no hay una incorporado en el núcleo método de la API de Java que puede llamar para validar un número entero, pero se puede utilizar la clase Character para validar su entrada sin mediante el manejo de excepciones. Por ejemplo:

package com.example.parseint;

public class ValidateIntExample {
    public static boolean isInteger(String s) {
        if (s == null) {
            return false;
        }

        s = s.trim();

        if (s.length() == 0) {
            return false;
        }

        int start = 0;
        if (s.charAt(0) == '-') { // handle negative numbers
            if (s.length() == 1) {
                return false;
            }
            else {
                start = 1;
            }
        }

        for (int i = start; i < s.length(); i++) {
            if (! Character.isDigit(s.charAt(i))) {
                return false;
            }
        }

        return true;
    }
}

De hecho, en sí parseInt utiliza Character.isDigit internamente, que se puede comprobar en el código fuente de JRE. (Lo siento, me he incluido el método parseInt aquí, pero no estoy seguro si se me permite bajo los términos de la licencia.) Si estás usando Eclipse y tiene el código fuente JRE unido a su proyecto, puede hacer + clic en el Integer.parseInt método en el código y haga clic en Abrir Declaración.

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