我的问题是,为什么我在调用SimulationExcpetion
时仍未获得未处理的异常类型damOverflowed()
,而在该方法的接口中未声明该异常类型package asgn1Solution;
import asgn1Question.SimulationException;
import asgn1Question.Log;
import asgn1Question.Actions;
public class DamActions implements Actions{
private Integer capacity;
private Integer nomRelease;
private Integer duration;
private Log logging;
public DamActions(Integer damCapacity, Integer defaultRelease, Integer jobDuration, WaterLog damLog) {
capacity = damCapacity;
nomRelease = defaultRelease;
duration = jobDuration;
logging = damLog;
}
public boolean levelTooLow() throws SimulationException {
if (logging.getEntry(0) < capacity*.25) {
return true;
} else {
return false;
}
}
public boolean damOverflowed() {
if (logging.getEntry(0) > capacity) {
return true;
} else {
return false;
}
}
。 `levelTooLow方法在接口和类中声明,并且很好。如果有帮助,我在底部添加了接口方法。
public boolean levelTooLow() throws SimulationException;
public boolean damOverflowed();
在Actions.java中
:
{{1}}
答案 0 :(得分:0)
从your other question开始,在您的WaterLog
课程中,您宣布了以下方法:
public Integer getEntry(Integer index) throws SimulationException {
if (thelog.isEmpty() || thelog.size() < index) {
return null;
}
return thelog.get(index);
}
这里要注意的重要一点是方法签名中的 throws SimulationException
子句。这表示任何调用getEntry
的方法必须处理SimulationException
或声明可能会抛出*。
*这并非严格来说,如果声明的异常是未经检查的异常(即RuntimeException
的衍生物),则您不会被迫处理它,即使你在throws
子句中声明它。但是,您收到有关此异常的编译错误表明SimulationException
是已检查的异常,因此需要处理或声明。
因此,您有三种选择。首先,您可以将getEntry
块中的try-catch
调用封闭起来,如下所示:
public boolean damOverflowed() {
try {
if (logging.getEntry(0) > capacity) {
return true;
} else {
return false;
}
} catch (SimulationException ex) {
// Do something here
}
}
或者,您可以声明damOverflowed
也可以抛出该异常:
public boolean damOverflowed() throws SimulationException {
最后,由于WaterLog#getEntry(Integer)
实际上似乎没有抛出该异常(尽管声明它可以),你的第三个选择是简单地从方法签名中删除声明:
public Integer getEntry(Integer index) {
if (thelog.isEmpty() || thelog.size() < index) {
return null;
}
return thelog.get(index);
}
我还建议您阅读Oracle的Lesson: Exceptions教程。