2010-08-22 31 views
10

¿Cómo puedo lanzar una excepción desde un constructor enum? por ejemplo:Cómo lanzar una excepción desde un constructor enum?

public enum RLoader { 
    INSTANCE; 
    private RLoader() throws IOException { 
    .... 
    } 
} 

produce el error

tipo no controlada excepción IOException

+6

¿Por qué querrías hacer eso? Para mí esto suena como un abuso del concepto enum. Se supone que los valores de Enum son constantes, cuya creación no depende de nada. Incluso si técnicamente pudieras hacerlo (lanzando una excepción sin marcar en lugar de una marcada), te sugiero que revises tu diseño. Si está intentando implementar un Singleton a través de esta enumeración, es mejor implementarlo a mano como una clase normal. –

+2

Estoy implementando un Singleton, pero ¿cómo sería mejor implementarlo a mano como una clase normal? Todavía tendría que arrojar una excepción del código invocado por un inicializador estático. Puede lanzar excepciones sin marcar desde un constructor enum. – tukushan

+0

hay algo * icky * sobre cómo obtener una excepción simplemente accediendo a un valor enum. No tan mal cuando se trata de un método singleton getInstance(). –

Respuesta

15

Debido casos se crean en un inicializador estático, lanzar una ExceptionInInitializerError su lugar.

+5

Aunque esa es una posible solución, no creo que tenga sentido resolver el problema de esa manera. –

0

Ese escenario no puede funcionar.

Está tratando de lanzar un Exception marcado desde el constructor.

Este constructor es invocado por la declaración de entrada de enumeración INSTANCE, por lo que la excepción comprobada no puede manejarse correctamente.

También es, en mi opinión, un mal estilo arrojar Excepciones de un constructor, ya que un constructor normalmente no debería hacer ningún trabajo y especialmente no crear errores.

Además, si desea lanzar un IOException supongo que desea inicializar algo de un archivo, por lo que tal vez debería considerar este artículo en dynamic enums.

+3

Si es un mal estilo arrojar Excepciones de un constructor, ¿qué haces cuando uno de los argumentos a tu constructor no es válido y evitará que tu clase funcione? Prefiero fallar rápidamente lanzando una excepción para poder obtener un rastro de pila significativo.Dicho esto, estoy de acuerdo con usted en que el OP no debería intentar lanzar una excepción en el ** constructor ** de ** enum. –

+0

@Kirk Woll: Prefiero usar métodos de fábrica que garanticen la validez de los parámetros. También me enfocaba principalmente en Excepciones marcadas, RuntimeException sería una mejor manera de señalar un error de verificación IMO. –

+2

¿Uso exclusivo de métodos de fábrica para todas las instancias de objetos? Oh, el pobre duende ** nuevo ** operador. :) –

3

Tengo un caso en el que quiero utilizar enumeraciones como claves en algunas clases de configuración. La base de datos almacenará un valor de cadena, lo que nos permite cambiar las constantes enum sin tener que udpatear la base de datos (un poco feo, lo sé). Quería lanzar una excepción de tiempo de ejecución en el constructor de la enumeración como una forma de vigilar la longitud del argumento de cadena para evitar golpear la base de datos y luego obtener una violación de restricción cuando podía detectarla yo mismo.

public enum GlobalSettingKey { 
    EXAMPLE("example"); 

    private String value; 

    private GlobalSettingKey(String value) { 
     if (value.length() > 200) { 
      throw new IllegalArgumentException("you can't do that"); 
     } 
     this.value = value; 
    } 

    @Override 
    public String toString() { 
     return value; 
    } 
} 

Cuando creé una prueba rápida para esto, me encontré con que la excepción lanzada no era mío, sino que fue un ExceptionInInitializerError.

Tal vez esto es tonto, pero creo que es un escenario bastante válido para querer lanzar una excepción en un inicializador estático.

+2

Pero la excepción original está encadenada con ExceptionInInitializerError, por lo que si llamas 'getCause()' a ella, obtendrás la excepción original. – shrini1000

Cuestiones relacionadas