продолжение выполнения после исключения в Java - PullRequest
22 голосов
/ 22 марта 2012

Я пытаюсь вызвать исключение (без использования блока try catch), и моя программа завершает работу сразу после создания исключения. Есть ли способ, чтобы после того, как я сгенерировал исключение, чтобы затем продолжить выполнение моей программы? Я выбрасываю исключение InvalidEmployeeTypeException, которое я определил в другом классе, но я хотел бы, чтобы программа продолжала работу после этого.

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


}

Ответы [ 3 ]

32 голосов
/ 22 марта 2012

Если вы сгенерируете исключение, выполнение метода остановится, и исключение будет сгенерировано для метода вызывающей стороны. throw всегда прерывает поток выполнения текущего метода. Блок try / catch - это то, что вы можете написать, когда вызываете метод, который может вызвать исключение, но выбрасывание исключения просто означает, что выполнение метода прекращается из-за ненормального состояния, а исключение уведомляет метод вызывающего это условие.

Найти этот урок об исключениях и как они работают - http://docs.oracle.com/javase/tutorial/essential/exceptions/

5 голосов
/ 22 марта 2012

Попробуйте это:

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

continue;
4 голосов
/ 27 декабря 2014

Если у вас есть метод, который вы хотите выдать ошибку, но вы хотите выполнить некоторую очистку в своем методе заранее, вы можете поместить код, который вызовет исключение, в блок try, а затем поместить очистку в блок catch,затем выведите ошибку.

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

Таким образом, блок try / catch на самом деле не обрабатывает ошибку, но дает вам время на выполнение вещи до завершения метода и гарантирует, что ошибка будет передана вcaller.

Примером этого может быть то, что если в методе изменилась переменная, то эта переменная стала причиной ошибки.Может быть желательно вернуть переменную.

...