有没有一种简短优雅的方法来编写异常提供的变量?

Is there a short elegant way to write variable providing with exception?

所以,我想为我的代码编写这些东西,但是一个变量的代码太多了。我如何使用现代 Java 来更短或更清晰地解决这个问题?在单独的方法中移动它并不能解决问题,因为我仍然需要检查变量是否为 null,这很冗长并且添加了仅使用一次的额外方法。可以在这里使用 Optionals 吗?似乎 return 阻止了这种情况。也许有办法将这个东西折叠成一个用于许多变量的东西,例如下面描述的 foo ?我不知道,只是为了让它更具可读性和简洁性。

Foo foo;
try {
    foo = FooProvider.getFoo(...);
} catch (FooProvidingException e) {
    System.err.println("Foo exception: " + e.getMessage());
    return;
}
// use foo, maybe in another method (when foo is the field).

我知道,这个问题可能有些自以为是,但任何帮助都是有效的答案。

抱歉我的英语不好,在此先感谢!

你问的不是很清楚,不知道我的回答在多大程度上有意义。

如果我理解得很好,你有任何类型的字段(FooBar...)并且你想使用你想要的任何类型的提供程序来实例化它们,这可以抛出提供时出现异常。

所以一开始,我认为如果提供程序抛出异常,您不应该 return,而是 re-throw 或处理它。因为如果您在获取 Foo 时出现异常,因此您实际上没有 Foo,您为什么要继续(或者为什么不尝试以某种方式处理它)?

现在这就是说,假设 re-throwing/handling 得到处理,那么我将定义一个 ThrowingSupplier 功能接口:

@FunctionalInterface
public interface ThrowingSupplier<T, E extends Exception> {
    T get() throws E;
} 

...然后我将创建一个静态方法,如下所示:

public static <T, E extends Exception> T provide(ThrowingSupplier<T, E> supplier) {
    try {
        return supplier.get();
    } catch (Exception e) {
        System.err.println("Exception: " + e.getMessage());
        throw (E) e;
    }
}

所以在那个时候,每次我想执行这种操作时,我都会简单地调用这个实用方法:

Foo foo = provide(() -> FooProvider.getFoo(...)); //either creates a Foo, or prints and re-throw a FooProvidingException
Bar bar = provide(() -> BarProvider.getBar(...)); //either createa a Bar, or prints and re-throw a BarProvidingException
Integer myInt = provide(() -> 3);
String myStr = provide(() -> "hello");
//... and so on

但当然,至少有一次您必须提取逻辑。然后就是以一种通用的方式提取它,并且不需要为每种不同类型的对象重复。

我也不确定这里的 end-goal 是什么,但据我了解,这是实现以下目标的 更简单 版本:

  • 声明并初始化变量
  • 正在通过服务提供商为其获取值
  • 处理由此抛出的任何异常(或者如果值为 null)并退出方法
  • 如果一切正常则继续执行
public static void main(String[] args) {
    Foo foo1, foo2, foo3, foo4;
    try {
        foo1 = Optional.ofNullable(FooProvider.getFoo()).orElseThrow(new FooProviderException(1));
        foo2 = Optional.ofNullable(FooProvider.getFoo()).orElseThrow(new FooProviderException(2));
        foo3 = Optional.ofNullable(FooProvider.getFoo()).orElseThrow(new FooProviderException(3));
        foo4 = Optional.ofNullable(FooProvider.getFoo()).orElseThrow(new FooProviderException(4));

        // this works in or out of try/catch block
        foo1.printName();
        foo2.printName();
        foo3.printName();
        foo4.printName();

    } catch (FooProviderException fpe) {
        System.out.println("Exception: " + fpe);
        return;
    }

    // this works in or out of try/catch block
    foo1.printAgain();
    foo2.printAgain();
    foo3.printAgain();
    foo4.printAgain();
}