我有一个类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而不是两个布尔值。
答案 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
。