如何将方法从异常类传递到异常构造函数?

时间:2019-02-15 21:11:26

标签: java exception error-handling

我编写了一个用于模拟汽车和燃油系统的类,一旦汽车驶过一定距离,我将尝试抛出“ 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());
        }

2 个答案:

答案 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());
}