【问题标题】:How to pass a method from exception class into exception constructor?如何将异常类中的方法传递给异常构造函数?
【发布时间】:2019-02-15 21:11:25
【问题描述】:

我写了一个类,它应该模拟汽车和燃油系统,一旦汽车驶过一定距离,我试图抛出“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());
        }

【问题讨论】:

  • 异常不应真正保持状态,而仅用于在需要时传达错误。所以 fulelNeeded 应该被传递到 super 的构造函数中,这样 stacktrace 就会显示这个值。例如:super("You need fuel: " + fuelNeeded);

标签: java exception error-handling


【解决方案1】:

您的Exception 类可能接受一个函数式 接口。

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";
}

根据您的需要进行调整,但请不要那样做。

【讨论】:

  • 不应该是final String value = valueSupplier.get(); 而是super(valueSupplier.get());?如果不将关键信息传递给 Exception 子类的超级构造函数,则堆栈跟踪将不包含关键信息。
  • @HovercraftFullOfEels 这只是一个例子。他/她会根据需要进行调整。
  • 很抱歉,但它看起来是一个非常糟糕的例子
  • @HovercraftFullOfEels OP 询问“我如何传递一个方法”
  • 这是一个XY Problem 类型的问题——他们是 Java 新手,不知道自己真正想要什么,问题措辞不佳,他们想要做的是传递一个值。
【解决方案2】:

让我们保持简单:您需要做的就是将 Exception 构造函数的 double 参数传递给超级构造函数的参数,就是这样。

异常不应真正保持状态,而主要用于在需要时传达错误。所以 fulelNeeded 应该被传递到 super 的构造函数中,这样 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());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2015-05-11
    • 2017-07-29
    • 1970-01-01
    • 2013-01-11
    • 2013-01-20
    • 1970-01-01
    相关资源
    最近更新 更多