2010-04-13 11 views
12

Tengo clases DirReader y Búsqueda. La búsqueda usa DirReader. Quiero que la búsqueda sepa cuándo DirReader arroja una excepción. Entonces, ¿cómo puedo tener una clase lanzando excepción?Java: ¿clase de lanzamiento de excepción?

Actualmente, uso initCorrect -dummy var. El método de estilo de excepción puede ser más apropiado.

ejemplo simplificado de error

$ javac ExceptionStatic.java 
ExceptionStatic.java:4: '{' expected 
public class ExceptionStatic throws Exception{ 
          ^
1 error 

Código

import java.util.*; 
import java.io.*; 

// THIS PART NEEDS TO BE FIXED: 
public class ExceptionStatic throws Exception{ 

    private static boolean initCorrect = false; 

    public static String hello; 
    static{ 
     try{ 
      hello = "hallo"; 

      //some other conditionals in real code 
      if(true) throw new Exception(); 

      initCorrect=true; 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args){ 
     if(initCorrect) 
      System.out.println(hello); 
    } 
} 

Respuesta

4

Es un error en tiempo de compilación para un inicializador de la clase ("bloque estático") para terminar con una excepción comprobada.

Si un inicializador de clase arroja una excepción sin marcar, el primer intento de inicializar la clase generará un ExceptionInInitializeError. Cualquier intento posterior de utilizar la clase provocará un NoClassDefFoundError. Si realmente desea usar una excepción, arroje algo como RuntimeException en el inicializador.

Sin embargo, el enfoque mostrado en la pregunta — estableciendo un indicador cuando la clase se inicializa correctamente — podría ser mejor para muchas aplicaciones. Más específicamente, diría que a menos que desee que todo el programa finalice cuando haya una falla de inicialización, use un indicador. Solo elimine la cláusula "throws" de la declaración de clase, porque esa no es una sintaxis legal.

+0

Lo que puede hacer es que cada método en la clase DirReader arroje una excepción si no se inicializa correctamente. –

3

Las clases no pueden lanzar excepciones. Solo los métodos pueden arrojar excepciones. Evite usar la clase base Exception. Lanza una excepción específica como IllegalStateException o extiende Exception y crea la tuya propia.

4

Tiene un bloque de código estático que arroja una excepción? Si realmente necesita hacer esto, arroje un RuntimeException - de lo contrario, mueva su lógica a un método asociado con un DirReader o clase de búsqueda y haga que esos métodos arrojen el Exception apropiado.

He aquí un ejemplo, usted puede comenzar con:

public class test { 


    static { 
     try { 
      method1(); 
     } catch (InterruptedException e) { 
      throw new RuntimeException(); 
     } 
    } 

    protected static void method1() throws InterruptedException {   
     Thread.sleep(1000);   
    } 


} 
+1

RuntimeException no se puede lanzar desde un bloque de inicialización estático. Obtendrá un error de compilación "El inicializador no se completa normalmente". –

+0

Tenga en cuenta que lanzar una RuntimeException hará que el cargador de clases genere una excepción, y la carga de clases es relativamente impredecible (excepto que ocurre antes de usar la clase). –

+0

@jonathon Acabo de probar una clase que arrojó una NullPointerException en un inicializador estático. Compiló bien, pero arrojó java.lang.ExceptionInInitializerError cuando intenté acceder a él. * No * es una buena idea lanzar una excepción en un inicializador estático –

24

La palabra clave throws no se puede aplicar a nivel de clase, solo en el nivel de método.

+1

¡GRACIAS! Nadie menciona esto. – NoName

Cuestiones relacionadas