我编写了一个用于模拟汽车和燃油系统的类,一旦汽车驶过一定距离,我将尝试抛出“ OutOfFuelException”,在此过程中,我想传递一个方法从OutOfFuelException类到构造函数调用,但是我不确定在不实际创建该类的实例的情况下怎么做。
以下是异常类的代码:
public class OutOfFuelException extends Exception {
private double fuelNeeded;
public OutOfFuelException (double fuelNeeded) {
super("You need fuel!");
this.fuelNeeded = fuelNeeded;
}
public double getShortfall() {
return fuelNeeded;
}
}
这是使用方法调用的尝试:
if (miles > getRange()) {
fuel = 0;
throw new OutOfFuelException(getShortfall());
}
答案 0 :(得分:0)
您的Exception
类可能接受 Functional 接口。
public class OutOfFuelException extends Exception {
public OutOfFuelException(final Supplier<String> valueSupplier) {
super(valueSupplier.get());
}
...
}
在这种情况下,您可以将不接受参数且返回String
值或适当的 lambda 表达式的方法引用传递给构造函数。
public void myMethod() throws OutOfFuelException {
...
if (miles > getRange()) {
throw new TestException(this::buildValue);
}
}
public String buildValue() {
return "My value";
}
根据您的需要进行调整,但是请不要这样做。
答案 1 :(得分:0)
让我们保持简单:您要做的就是将Exception构造函数的double参数传递给super构造函数的参数,就是这样。
异常不应真正保持状态,而主要用于在需要的地方传达错误。因此,应该将fulelNeeded传递给超级对象的构造函数,以便stacktrace将显示此值。例如:
super("You need fuel: " + fuelNeeded);
整个过程比您的接线方式更简单:
public class OutOfFuelException extends Exception {
public OutOfFuelException (double fuelNeeded) {
super("Fuel shortfall: " + fuelNeeded);
}
}
所以这应该起作用:
if (miles > getRange()) {
fuel = 0;
throw new OutOfFuelException(getShortfall());
}
或更简单:
if (miles > getRange()) {
fuel = 0;
throw new OutOfFuelException(miles - getRange());
}