todas tabla son que nombre listado las excepciones excepcion cuales crear clasificacion clase java exception try-catch numberformatexception

java - tabla - ¿Cuál es la forma correcta de manejar una excepción NumberFormatException cuando se espera?



que es un excepcion en java (8)

Me encuentro en esta situación en la que necesito analizar una String en un int y no sé qué hacer con la NumberFormatException . El compilador no se queja cuando no lo atrapo, pero solo quiero asegurarme 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; }

Solo quiero simplificar mi código de esta manera. El compilador no tiene ningún problema con él, pero el hilo muere en la NumberFormatException .

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

Google CodePro quiere que registre la excepción de alguna manera, y estoy de acuerdo en 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 NumberFormatException la NumberFormatException explícitamente, ¿no asigna la variable i ? ¿O hay algún valor predeterminado que devuelve Integer.parseInt() ?

El estilo general dice que si detecto una excepción, debería registrarla en algún lugar. No quiero registrarlo. Es normal que se lance esta excepción a veces, lo que tampoco me sienta bien. Sin embargo, no puedo encontrar una función que me dirá si Integer.parseInt() lanzará una excepción. Así que mi único curso de acción parece ser simplemente llamarlo y atrapar la excepción.

El javadoc para parseInt no ayuda mucho.

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

  • ¿Hay algún método al que pueda llamar que me diga si Integer.parseInt() emitirá una NumberFormatException antes de llamarla? Entonces no tendría ningún problema en registrar esto, ya que nunca debería suceder.
  • Si simplemente no capto la excepción, ¿no se asignará al valioso? Luego simplemente lo inicializaré al valor que quiero cuando no sea un número y no capturaré la excepción.
  • ¿Hay una manera de marcar la excepción de alguna manera explícita que no me importa? Estoy pensando que esto sería algo similar a AWTEvent.consume() . Si es así, haré esto para que Google CodePro no vea esto como "no registrado".

Como han mencionado otros, no hay un método de API Java central incorporado al que pueda llamar para validar un entero, pero puede usar la clase de Character para validar su entrada sin usar el control 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, parseInt utiliza Character.isDigit internamente, que puede verificar en el código fuente de JRE. (Lo siento, hubiera incluido el método parseInt aquí, pero no estoy seguro de que esté permitido según los términos de la licencia). Si está utilizando Eclipse y tiene el código fuente JRE adjunto a su proyecto, puede hacerlo. -Haga clic en el método Integer.parseInt en su código y haga clic en Abrir Declaración.


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

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 algún método al que pueda llamar que me diga si Integer.parseInt () emitirá una excepción NumberFormatException antes de llamarla? Entonces no tendría ningún problema en registrar esto, ya que nunca debería suceder.

No que yo supiese. Tenga en cuenta que, de haberlos, es probable que termine analizando el valor dos veces (una vez para validarlo y otra para analizarlo). Entiendo que desea evitar la excepción, pero en este caso, esta captura de la excepción es el lenguaje estándar en Java y no proporciona otro (al menos que yo sepa).

Si simplemente no capto la excepción, ¿no se asignará al valioso? Luego simplemente lo inicializaré al valor que quiero cuando no sea un número y no capturaré la excepción.

Debe capturar la excepción (incluso si no hace nada) o se escapará del bloque y se lanzará a través de la pila.

¿Hay una manera de marcar la excepción de alguna manera explícita que no me importa? Estoy pensando que esto sería algo similar a AWTEvent.consume (). Si es así, haré esto para que Google CodePro no vea esto como "no registrado".

No sé de ninguna. Usaría el método de conveniencia anterior (tengo algo similar en una pequeña colección de utilidades generales que tengo disponible para usar en todos mis proyectos).

No lo registraría si es realmente una condición normal que estás manejando. No estoy familiarizado con Google CodePro, pero espero que haya una forma de suprimir la advertencia, por ejemplo, algún tipo de anotación / palabra clave @SuppressWarnings ("xxx").

Edit: 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 atrapar una excepción y no hacer nada con ella. Por eso busco una mejor solución.

.

... La excepción (la situación) se está manejando devolviendo el valueIfInvalid indicado. La "mala forma" se refiere a la mala práctica de escribir ciegamente los bloques de captura vacíos y nunca volver a considerar y abordar el caso. Si se considera la situación de excepción y hace lo correcto para la situación ( incluso si lo correcto es no hacer nada ), entonces usted ha "manejado" la excepción .


Deberías atrapar la Excepción mientras lo haces. Es molesto, pero el mejor enfoque.

No hay ningún método API de Java que devuelva 0 cuando la cadena no sea un int válido.

Cuando la cadena no es un int, se lanzará una excepción, por lo que su variable int no se establecerá a menos que detecte la excepción mientras lo hace.



Si no está claro cómo debe manejarlo desde el captador, no debe atraparlo y dejar que la persona que llama lo trate. Si sabes cómo se debe manejar, debes hacerlo. Registrarlo puede no ser necesario o muy útil en este caso.

Registrar una excepción es más útil si no sabe cómo manejar la excepción y se la deja a la persona que está leyendo los registros.


Tu primer bloque de código es correcto. No se convertirá implícitamente a 0 cuando se produce una excepción y usted debe capturar esa excepción. El ajuste de i en 0 dentro de la catch es correcto; aunque simplemente puedes reemplazar i = 0; con return 0; . No puede evitar el manejo de excepciones en este caso.

Para aclarar, puedes usar esto:

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; }


* 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 deshabilitar localmente una regla de auditoría de CodePro para una línea de código:

http://code.google.com/javadevtools/codepro/doc/features/audit/locally_disabling_audit_rules.html

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


  • ¿Hay algún método al que pueda llamar que me diga si Integer.parseInt () emitirá una excepción NumberFormatException antes de llamarla? Entonces no tendría ningún problema en registrar esto, ya que nunca debería suceder.

Tristemente no. Al menos no en el núcleo de la API de Java. Sin embargo, es fácil escribir uno, solo modifique el código a continuación.

  • Si simplemente no capto la excepción, ¿no se asignará al valioso? Luego simplemente lo inicializaré al valor que quiero cuando no sea un número y no capturaré la excepción.

Si no atrapa la excepción, la pila se desenrollará hasta que llegue a un bloque catch que la manejará, o se desenrollará completamente y detendrá el hilo. De hecho, la variable no se asignará, pero esto no es exactamente lo que desea.

  • ¿Hay una manera de marcar la excepción de alguna manera explícita que no me importa? Estoy pensando que esto sería algo similar a AWTEvent.consume (). Si es así, haré esto para que Google CodePro no vea esto como "no registrado".

Puede haber una manera de decirle a CodePro que ignore esta advertencia en particular. Ciertamente, con herramientas como FindBugs y Checkstyle puede desactivar las advertencias en ubicaciones específicas. (EDITAR: @Andy ha señalado cómo hacer esto).

Sospecho que lo que quieres es algo como el paquete Commons lang mencionado por @daveb. Es bastante fácil escribir una función así:

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; } }