2012-03-22 21 views
17

Estoy intentando lanzar una excepción (sin usar un bloque try catch) y mi programa finaliza justo después de que se lanza la excepción. ¿Hay alguna manera de que después de arrojar la excepción, para luego continuar la ejecución de mi programa? Lanzo InvalidEmployeeTypeException que he definido en otra clase pero me gustaría que el programa continúe después de que se lanza.continuación de la ejecución después de que se lanza una excepción en java

private void getData() throws InvalidEmployeeTypeException{ 

    System.out.println("Enter filename: "); 
    Scanner prompt = new Scanner(System.in); 

    inp = prompt.nextLine(); 

    File inFile = new File(inp); 
    try { 
     input = new Scanner(inFile); 
    } catch (FileNotFoundException ex) { 
     ex.printStackTrace(); 
     System.exit(1); 
    } 

    String type, name; 
    int year, salary, hours; 
    double wage; 
    Employee e = null; 


    while(input.hasNext()) { 
     try{ 
     type = input.next(); 
     name = input.next(); 
     year = input.nextInt(); 

     if (type.equalsIgnoreCase("manager") || type.equalsIgnoreCase("staff")) { 
      salary = input.nextInt(); 
      if (type.equalsIgnoreCase("manager")) { 
       e = new Manager(name, year, salary); 
      } 
      else { 
       e = new Staff(name, year, salary); 
      } 
     } 
     else if (type.equalsIgnoreCase("fulltime") || type.equalsIgnoreCase("parttime")) { 
      hours = input.nextInt(); 
      wage = input.nextDouble(); 
      if (type.equalsIgnoreCase("fulltime")) { 
       e = new FullTime(name, year, hours, wage); 
      } 
      else { 
       e = new PartTime(name, year, hours, wage); 
      } 
     } 
     else { 


      throw new InvalidEmployeeTypeException(); 
      input.nextLine(); 

      continue; 

     } 
     } catch(InputMismatchException ex) 
      { 
      System.out.println("** Error: Invalid input **"); 

      input.nextLine(); 

      continue; 

      } 
      //catch(InvalidEmployeeTypeException ex) 
      //{ 

      //} 
     employees.add(e); 
    } 


} 

Respuesta

4

Prueba esto:

try 
{ 
    throw new InvalidEmployeeTypeException(); 
    input.nextLine(); 
} 
catch(InvalidEmployeeTypeException ex) 
{ 
     //do error handling 
} 

continue; 
+25

¿No crees que este no es un buen ejemplo de cómo usar Excepciones? – manub

+1

Esto funcionó perfectamente. Pude ocuparme del manejo de errores y continuar la ejecución –

+0

Me tomó un tiempo darme cuenta de por qué este código "no es un buen ejemplo" en el comentario de apertura redactado educadamente. 'input.nextLine();' nunca se ejecuta. – Reg

30

Si lanza la excepción, la ejecución del método se detendrá y se lanzará la excepción al método de la persona que llama. throw siempre interrumpe el flujo de ejecución del método actual. un bloque try/catch es algo que puede escribir cuando llama a un método que puede arrojar una excepción, pero lanzar una excepción solo significa que la ejecución del método finaliza debido a una condición anormal y la excepción notifica al método llamador de esa condición.

Encuentra este tutorial sobre la excepción y cómo funcionan - http://docs.oracle.com/javase/tutorial/essential/exceptions/

4

Si usted tiene un método que usted quiere lanzar un error, sino que quiere hacer algo de limpieza en su método de antemano puede poner el código que lanzará la excepción dentro de un bloque de prueba, luego ponga la limpieza en el bloque catch y luego arroje el error.

try { 

    //Dangerous code: could throw an error 

} catch (Exception e) { 

    //Cleanup: make sure that this methods variables and such are in the desired state 

    throw e; 
} 

De esta manera el bloque try/catch en realidad no está manejando el error pero le da tiempo para hacer las cosas antes de que el método termina y aún así se asegura de que el error se transmite a la persona que llama.

Un ejemplo de esto sería si una variable cambia en el método, entonces esa variable es la causa de un error. Puede ser deseable revertir la variable.

Cuestiones relacionadas