2011-09-05 16 views
7

Estoy tratando de verificar si el valor pasado por un usuario es constante o no. Aquí está el código que he escrito.Uso de excepciones para validar las entradas

enum Media_Delivery { 
    Streaming, Progressive 
} 

public class TestMain { 
    public static void main(String[] args) { 
     String medi_delivery = "streaming"; 
     try { 
      Media_Delivery.valueOf("streaming"); 
     } catch (IllegalArgumentException e) { 
      System.out.print(e); 
     } 

    } 

} 

Ahora, en el código de si la cadena pasada no está en el canto enumeración cotizada entonces tiros IllegalArgumentException que es obvio.

Pero mi pregunta es: ¿Es esta la forma correcta de validar? Como usamos el mecanismo de excepción de Java para validar.

¿Alguien puede sugerir una idea mejor o lo que he codificado anteriormente es la mejor opción?

----- -------- EDITAR

Otro caso lo que quería discutir:



    public class TestMain { 
      public static void main(String[] args) { 
       String inputPassed = "2a"; 
       try { 
        Integer.parseInt(inputPassed); 
       } catch (NumberFormatException nfe) { 
        throw new SomeUserDefinedException("Please enter only numeric values"); 
       } 

      } 

Así que es una buena idea? ¿O debería haber nuestro propio mecanismo de análisis?

+1

Por lo general, se considera mala práctica de "código hacia excepciones", en otras palabras, el uso de excepciones a determinar la lógica Eche un vistazo a lo que sugirió @Chris. –

Respuesta

1

Yo diría que depende.

Si la entrada proviene del elemento GUI como combobox o cualquier otra cosa, donde los valores enum son los únicos que se pueden elegir, entonces su enfoque es correcto. Aquí el valor diferente sería realmente una excepción.

Pero si está haciendo una aplicación de consola, o envía un mensaje de texto con la posibilidad de escribir cualquier cosa, entonces el resultado es diferente, entonces los valores enum no se deben considerar como excepción. Debe usar if-else normal o casos con este enfoque.

en general: use excepciones solo para casos excepcionales, y no para algo que sea realmente agradable.

2

Por lo general, es una buena práctica no capturar o lanzar expresiones sin marcar (IllegalArgumentException es un RuntimeException que cuenta como "desmarcado"). Ver the Java Tutorials - Exceptions para más detalles. Si puede evitarlo, intente volver a escribir su código de modo que no se necesite capturar una excepción de tiempo de ejecución. Este es un tema controvertido, pero las excepciones de tiempo de ejecución existen por una razón: ayudan al programador a identificar errores. Si los atrapas, entonces el error no se soluciona, solo se está evitando. Intenta usar una instrucción if-else?

Según the API, "el nombre debe coincidir exactamente con un identificador utilizado para declarar una constante enum". Creo que esto significa que el parámetro es sensible a mayúsculas. Además, el tipo de devolución del método valueOf es de algún tipo, no void, por lo que no puede tener esa declaración en el bloque try. Los bloques try deben contener comandos o métodos void, como int x = 3; o System.out.println(3); o algo así.

-------- ------- EDITAR

OP, en respuesta a su comentario:

Como otros han dicho, depende de lo que estamos tratando cumplir. Supongo que ya que tiene la línea Media_Delivery.valueOf("streaming"); en el bloque try, que está tratando de ver si "streaming" es igual a una de las constantes enum?En ese caso, no habría necesidad de una instrucción if-else, simplemente puede escribir

boolean result = medi_delivery.equals(Media_Delivery.Streaming.name()) || 
    medi_delivery.equals(Media_Delivery.Progressive.name()); 
System.out.println(result); 

O aún mejor, si no quieren tener múltiples || condiciones, trate de una declaración switch que los ciclos a través de cada constante enum, probando la igualdad de la cadena dada.

-Chris

PS: en la convención de nomenclatura, ya que las constantes de enumeración son implícitamente static final, es una práctica común para declarar ellos en todas las tapas, como STREAMING y PROGRESSIVE (the Java Tutorials - Enums).

+0

¿Eh? Puede ignorar los objetos devueltos dentro de un bloque try catch como puede hacerlo en cualquier otro lugar del código. Si es una buena idea o no es un tema separado y uno que dependerá de lo que el programador está tratando de lograr. – user439407

+0

Entonces testSubject528491 ¿Cómo puedo realizar la tarea anterior con if-else? ¿Puedes por favor poner un código de muestra? –

+1

Muchas gracias Chris por su sugerencia y respuesta. –

1

No hay una única forma "correcta" de validar, lo que tiene ciertamente sería la forma en que validaría, pero hay otras formas (por ejemplo, podría poner todos los valores de cadena válidos de la enumeración en un HashSet y luego verifique con ese conjunto para ver si es válido, eso es probablemente lo que hace el método valueOf de todos modos)

Ahora bien, si el enfoque anterior es "mejor" o no, también es muy subjetivo. Si está haciendo las validaciones en un bucle y desea rechazar cualquier cosa que contenga datos inválidos, entonces el enfoque de excepción es probablemente el mejor. Si desea marcar todos los elementos inapropiados, entonces cualquiera de los enfoques funciona ... el HashSet probablemente sea más rápido si hay una gran cantidad de datos problemáticos ya que no tendrá que generar una gran cantidad de nuevos objetos de excepción, pero incluso entonces la diferencia en el rendimiento será bastante insignificante.

+0

'rendimiento' y' use o no use excepción aquí' son dos temas muy separados;) – dantuch

8

Las excepciones se deben utilizar para condiciones excepcionales; cosas que no espera que sucedan Validar la entrada no es muy excepcional.

Josh Bloch explica esto específicamente en su libro 'Effective Java' que en mi humilde opinión es algo que todo programador de Java debería tener.

EDIT: Y esto es en realidad una muy buena respuesta a la forma de abordar el problema:

Check valid enum values before using enum

Cuestiones relacionadas