我无法让我的方法抛出自定义异常

时间:2015-02-11 23:12:50

标签: java exception methods superclass custom-exceptions

我有一个类EmployWorker,它是我为学校项目创建的超类Employee。我们应该在本周为它设置例外,并且在尝试创建其中一个时我一直收到错误。这是我的代码:

在ProductionWorker中

   public String toString() throws InvalidShift{
      DecimalFormat dollar = new DecimalFormat("$#,##0.00");
      String str = super.toString();

      str += "The employee's pay rate is " + dollar.format(getPayRate()) +"\n";
      str += "The employee works the " + getShift() + " shift";
      return str;
   }

super.toString类:

   public String toString() throws InvalidShift{
      String str = "The employee's name is " + getEmployeeName() + ".\n";
      if (employeeNumber.equals("")){
         str += "The employee's ID number is invalid.\n";
      }else{
         str += "The Employee's ID number is " + employeeNumber + ".\n";
      }
      str += "The employee's hire date was " + hireDate + ".\n";

      return str;
   }

当我尝试编译时,我收到以下错误:

Employee.java:126: error: toString() in Employee cannot override toString() in Object
   public String toString() throws InvalidShift{
                 ^
  overridden method does not throw InvalidShift
ProductionWorker.java:54: error: toString() in ProductionWorker cannot override toString() in Object
   public String toString() throws InvalidShift{
                 ^
  overridden method does not throw InvalidShift

现在,实际异常本身在getShift()方法中抛出,因此Employee.toString()方法无法实际抛出异常。程序将进入ProductionWorker.toString(),运行Employee.toString()并返回它的字符串,然后执行getShift(),可以抛出异常。因此,我不需要Employee.toString()能够投掷,如果有的话,它会导致其他问题。

任何帮助?

修改

我只是将整个事情改写为int而不是两个布尔值。

2 个答案:

答案 0 :(得分:6)

底线是这样的:不应该写 toString()来抛出任何异常。期间唯一的工作就是创建一个表示对象状态的String。它不应该改变对象本身的状态,它永远不需要抛出异常。

throws InvalidShift中删除toString()

相反,将此语句添加到实际可能抛出异常的方法中。

你说:

  

现在,实际异常本身在getShift()方法中抛出,

因此应该声明此方法抛出异常。

  

因此,Employee.toString()方法无法实际抛出异常。

右。所以它不应该像你在你的代码中那样被声明为抛出它。

  

程序将进入ProductionWorker.toString(),运行Employee.toString()并返回它的字符串,然后执行getShift(),这可能会抛出异常。因此,我不需要Employee.toString()能够投掷,如果有的话,它会导致其他问题。

那么为什么要声明它首先抛出异常?


是的,将其重命名为InvalidShiftException


更多

  

我无法在setShift()方法中使用它,因为默认情况下运行setShift方法会将shiftValid设置为true。基本上我有两个布尔变量:dayShift和shiftValid。如果从不运行setShift(),则shiftValid将为false,如果有人关注getShift(),则应抛出异常。

然后应声明getShift()抛出异常,实际上如果有人在对象处于无效状态时调用它(如果没有调用setShift()则抛出异常) )。

如,

public Shift getShift() thows InvalidShiftException {
   if (!shiftValid) {
      throw new InvalidShiftException("maybe some text in here");
   } else {
      return whatIsSupposedToBeReturned;
   }
}

修改
你说:

  问题是toString()调用了getShift(),因此抛出异常时toString()将在堆栈中。没有解决这个问题。

是的!在toString()中使用try / catch!或者在getShift()内调用toString()之前先测试shift是否有效(调用布尔方法)

答案 1 :(得分:2)

您不能声明toString()抛出已检查的异常,但您可以声明它(或者只是抛出而不声明抛出)未经检查的异常 - 其中是RuntimeException的子类。

将您的例外类更改为RuntimeException而不是Exception