是否有一个简短优雅的方式来编写变量提供异常?



我想为我的代码写这些东西,但是一个变量的代码太多了。如何使用现代Java更简洁地解决这个问题?将它移动到单独的方法中并不能解决问题,因为我仍然需要检查变量是否为null,这是冗长的,并且添加了只使用一次的额外方法。这里可以使用选项吗?似乎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).

我知道这个问题可能有些固执己见,但任何帮助都是有效的答案。

很抱歉我的英语不好,提前感谢!

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

如果我理解得好,您有任何类型的字段(Foo,Bar…),并且您希望使用任何类型的提供程序实例化它们,这可以在提供时抛出异常。

所以首先,我不认为你应该return,如果一个异常是由提供者抛出的,而是重新抛出它或处理它。因为如果你在得到Foo的时候有一个异常,那么你实际上没有Foo,为什么你要继续(或者为什么你不尝试以某种方式处理它)?

现在说,并假设重新抛出/处理被照顾,然后我将定义一个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

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

我也不确定这里的最终目标是什么,但是,据我所知,这里有一个更简单的版本来实现以下目标:

  • 声明和初始化变量
  • 使用服务提供者为它获取值
  • 处理由this(或如果值为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();
}

最新更新