2017-10-25 8 views
1

私はメインクラスと従業員クラスを持っています。私の目標は、2番目のテストでは、時間単位の入力レートが-20であることから、「賃金はマイナスにはならない」と返すことです。代わりに、それは総ドルをマイナスにしています。何を修正する必要がありますか?私は自分の問題がスローキャッチステートメントのどこかにあるように感じます。エラーはありませんが、私の見積もりは表示されません。あなたがすることができますまたはコンストラクタ内部例外のロジックを置く、またはあなたが例外をチェックして、ゲッターを使用するために使用しているパラメータなしのコンストラクタを作成することができ、ここで私は考えることができる2つのオプションがありget setステートメントをスローしてキャッチ

package employee; 

public class Main { 

    public static void main(String[] args) { 

     Employee ryan = new Employee("Ryan", "Smith", 40, 20); 

     System.out.println("Test #1"); 
     System.out.println(ryan.getFirstName() + " " + ryan.getLastName() + ", worked " + ryan.getHoursWorked() + " hours and earned $" 
       + ryan.getHoursWorked() * ryan.getWage()); 

     Employee hayden = new Employee("Hayden", "Moore", 20, -10); 

     System.out.println("Test #2"); 
     System.out.println(hayden.getFirstName() + " " + hayden.getLastName() + ", worked " + hayden.getHoursWorked() + " hours and earned $" 
       + hayden.getHoursWorked() * hayden.getWage()); 
    } 
} 

package employee; 

public class Employee { 
    private String firstName, lastName; 
    int hoursWorked, wage; 

    public Employee(String firstName, String lastName, int hoursWorked, int wage) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.hoursWorked = hoursWorked; 
     this.wage = wage; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public void setHoursWorked(int hoursWorked) { 
     this.hoursWorked = hoursWorked; 
    } 

    public int getHoursWorked() { 
     return hoursWorked; 
    } 

    public void setWage(int wage) { 
     if (wage < 0) { 
      try { 
       throw new Exception("Wage cannot be negative"); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else 
      this.wage = wage; 
    } 

    public int getWage() { 
     return wage; 
    } 
} 
+2

セッターの賃金の有効性をチェックしますが、このセッターは決してどこでも呼び出されません。コンストラクタで負の賃金を渡しますが、コンストラクタは賃金を検証しません。また、例外をスローしてすぐにキャッチすることは意味をなさない。例外の全ポイントは、メソッドの**呼び出し側**に何かが間違っていることを警告することです。セッターで例外をキャッチしないでください。適切な実行時例外:IllegalArgumentExceptionを使用します。 –

+1

なぜ例外をスローしてすぐにキャッチしますか? – tkausl

+0

1.コンストラクタを読む 2.ソースコードをデバッグしてください 3. getterとsetterのtry/catchを避け、検証でinitメソッドを使用してください –

答えて

0

と代わりにインスタンスを設定します。私はコンストラクタの内部でセッターを使用することをお勧めしません、あなたがそれを行う場合、ロジックは少し不明を取得しますが、あなたも行うことができるものです

+0

"例外のロジックをコンストラクタ内に置くことができます。それは冗長でしょうか?コントロールをセッターとコンストラクタに配置するには? – BaSsGaz

+0

正確には、コンストラクタにパラメータを渡して、ユーザにセッタを使用させない方が良い理由です –

0

あなたはコンストラクタではなく、あなたのコンストラクタを変更、直接渡された値を割り当てる:この方法では

public Employee(String firstName, String lastName, int hoursWorked, int wage) { 
    setFirstName(firstName); 
    setLastName(lastName); 
    setHoursWorked(hoursWorked); 
    setWage(wage); 
} 

、すべての引数は、セッターを通過する必要があります。