2012-03-22 18 views
17

Sto provando a generare un'eccezione (senza utilizzare un blocco catch try) e il mio programma termina subito dopo l'eccezione. C'è un modo che dopo aver lanciato l'eccezione, per poi continuare l'esecuzione del mio programma? Lancio InvalidEmployeeTypeException che ho definito in un'altra classe ma vorrei che il programma continuasse dopo che questo è stato lanciato.esecuzione continua dopo che un'eccezione è stata generata in 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); 
    } 


} 

risposta

4

Prova questo:

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

continue; 
+25

Non pensi che questo non sia un buon esempio di come usare Eccezioni? – manub

+1

Questo ha funzionato perfettamente. Sono stato in grado di occuparmi della gestione degli errori e continuare l'esecuzione –

+0

Mi ci è voluto un po 'per capire perché questo codice non è "un buon esempio" nel cortese commento di apertura. 'input.nextLine();' non viene mai eseguito. – Reg

30

Se si lancia l'eccezione, l'esecuzione del metodo si interrompe e l'eccezione viene generata al metodo del chiamante. throw interrompono sempre il flusso di esecuzione del metodo corrente. a try/catch il blocco è qualcosa che è possibile scrivere quando si chiama un metodo che può generare un'eccezione, ma l'emissione di un'eccezione significa solo che l'esecuzione del metodo viene interrotta a causa di una condizione anomala e l'eccezione notifica il metodo chiamante di quella condizione.

Trova questo tutorial su eccezione e come funzionano - http://docs.oracle.com/javase/tutorial/essential/exceptions/

4

Se si dispone di un metodo che si vuole lanciare un errore, ma si vuole fare un po 'di pulizia nella vostra metodo in anticipo è possibile inserire il codice che genererà l'eccezione all'interno di un blocco try, quindi inserire la pulizia nel blocco catch, quindi lanciare l'errore.

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; 
} 

In questo modo il blocco try/catch non è effettivamente gestisce l'errore, ma si dà il tempo di fare le cose prima che il metodo termina e assicura che l'errore viene trasmesso al chiamante ancora.

Un esempio di questo sarebbe se una variabile modificata nel metodo allora quella variabile fosse la causa di un errore. Potrebbe essere opportuno ripristinare la variabile.

Problemi correlati