2012-03-22 23 views
17

例外をスローしようとしています(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); 
    } 


} 

答えて

4

これを試してみてください:

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

continue; 
+25

これは例外の使用方法の良い例ではないと思いませんか? – manub

+1

これは完全に機能しました。私はエラー処理の世話をして、実行を続けることができました –

+0

丁寧に言いましたオープニングコメントでこのコードが「良い例ではありません」という理由を理解するのはしばらく時間がかかりました。 'input.nextLine();'は決して実行されません。 – Reg

30

あなたが例外をスローした場合、メソッドの実行が停止し、例外が呼び出し側メソッドにスローされます。 throwは、常に現在のメソッドの実行フローを中断します。 a try/catchブロックは、例外をスローする可能性があるメソッドを呼び出すときに書くことができるものですが、例外をスローするということは、異常な状態のためにメソッドの実行が終了したことを意味し、例外は呼び出し元メソッドにその条件を通知します。

例外については、このチュートリアルを見つけ、彼らがどのように動作するか - http://docs.oracle.com/javase/tutorial/essential/exceptions/

4

あなたがエラーをスローするメソッドを持っていますが、中にいくつかのクリーンアップを行いたい場合は、あなたのメソッドを事前に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ブロックは、実際にエラーを処理していないが、それはあなたの方法が終了すると、まだエラーが呼び出し元に渡されることを確実にする前にものを行うための時間を与えます。

たとえば、変数がメソッドで変更され、その変数がエラーの原因であったとします。変数を元に戻すことが望ましい場合があります。

関連する問題