2011-08-26 10 views
18

Las excepciones de tiempo de ejecución indican un contrato interrumpido (como NPE) y nunca se deben lanzar si el código no tiene errores. Siempre indica un error en el código (lo mismo que afirma pero afirma que son errores de clase internos mientras que Runtime son para los errores de cliente de la clase).¿Por qué NumberFormatException es el tiempo de ejecución?

Las excepciones de tiempo de ejecución nunca deben ser atrapadas.

Las excepciones marcadas, por otro lado, son parte de la firma y deben ser capturadas y procesadas. Pueden indicar errores de entrada del usuario o problemas de recursos externos (como IOException).

Con todo esto, no entiendo por qué NumberFormatException es tiempo de ejecución?

+2

Sin código nadie puede responder eso. – RoflcoptrException

+1

Al igual que la forma en que el compilador no sabe que un objeto es nulo cuando algo se opera en él, no sabe si la cadena que se analiza es realmente un número o no. Es una excepción que solo se producirá durante el tiempo de ejecución. – asgs

+12

@Roflcoptr: Pregunta por qué NumberFormatException es una excepción de Runtime, no por qué está obteniendo una. – Vache

Respuesta

0

¿Por qué NumberFormatException es un error de tiempo de ejecución? Bien, si tiene un diálogo donde el usuario ingresa un valor, y el valor no es un número, sino que se analiza como tal, le recomendamos que se entere. ¿Es una excepción la mejor manera? Quizás no, pero es lo que es.

+2

Creo que la pregunta es que se trata de una subclase de RuntimeException en lugar de una Excepción simple, que no está siendo una excepción marcada. –

8

En primer lugar, el que te dijo

excepciones de tiempo de ejecución no deben ser capturados

no sabe mucho acerca de Java. No los escuches, están equivocados.

NumberFormatException es una excepción de tiempo de ejecución: se eligen excepciones no marcadas porque indican un error de programación . Es posible saber antes de llamando al Integer.parseInt() (por ejemplo) que una Cadena es un número entero válido, p. Ej. aquí es sólo una manera:

if (str.matches("^\\d{1,8}$") { 
    int myInt = Integer.parseInt(str); // will never throw NumberFormatException 
} 

Por lo tanto, se puede considerar un error de programación que nunca conseguir uno - el programador optó por no cheque en primer lugar.

Si no está seguro acerca de la integridad/calidad de la cadena que está a punto de analizar, es fácil coger:

try { 
    // parse your string 
} catch (NumberFormatException e) { 
    // do something about it 
} 

La otra razón para que sea un tiempo de ejecución es que no lo hace el desorden el código con bloques try/catch potencialmente innecesarios, si está seguro de que no obtendrá uno, por ejemplo si confiar totalmente en el origen de los datos de Cadena.

+7

Sin embargo, lo mismo podría decirse de algunas excepciones comprobadas como 'URLFormatThingyException' y qué tiene usted. En resumen, todo es un desastre. –

+1

y lo mismo - verificar de antemano - ¡también podría decirse acerca de NPE! –

+1

¡absolutamente! Siempre compruebo si hay NPE: 'if (str! = Null && ...)' etc. – Bohemian

2

NumberFormatException extiende IllegalArgumentException. La razón por la cual esta es una excepción en tiempo de ejecución es que es completamente posible romper el contrato de un método que toma un String y devuelve un Number. Si paso en 123D y no hay una validación adecuada de los datos, esto sería un argumento ilegal apropiado.

3

NumberFormatException también podría ser lanzado al analizar los archivos de configuración, en cuyo caso sería un error del programador. Al analizar la entrada del usuario, usualmente usa NumberFormat, que arroja un ParseException marcado.

+0

Los archivos de configuración no son siempre (o incluso a menudo) bajo el control de los programadores, pero creo que su punto está bien definido. Las bibliotecas de Java proporcionan API distintas para manejar la entrada de una fuente de confianza frente a la entrada de una fuente que no es de confianza. – CurtainDog

+0

¡sí! Tuve suerte y encontré esta respuesta, esto explica por qué NumberFormat suscita una ParseException comprobada, mientras que Integer.parseInt arroja una excepción de tiempo de ejecución. buen punto acerca de los archivos de configuración, es decir, creo exactamente cómo fue diseñado y destinado a ser utilizado - NumerFormat para la entrada del usuario, Integer.parseInt para el resto –

0

En cierto sentido, NumberFormatExceptiones una excepción en tiempo de compilación. Pero en lugar de ser arrojado por el compilador de Java, es arrojado por el formato string parser/compiler cuando su programa lo ejecuta.Lo mismo se aplica a Pattern y otros usos de expresiones regulares; su programa está ejecutando el analizador/analizador.

Cuestiones relacionadas