Java 使用Google Guava的异常
使用GoogleGuava和应该抛出异常的方法的最佳模式是什么 假设我有:Java 使用Google Guava的异常,java,exception,guava,Java,Exception,Guava,使用GoogleGuava和应该抛出异常的方法的最佳模式是什么 假设我有: public Sting someMethod(Integer i) throws SomeException; 我想做: List<String> s=Lists.transform(is,new Function<String, Integer>() { public String apply(Integer i) { return someMethod(i)
public Sting someMethod(Integer i) throws SomeException;
我想做:
List<String> s=Lists.transform(is,new Function<String, Integer>() {
public String apply(Integer i) {
return someMethod(i);
}
});
Lists s=Lists.transform(是,新函数(){
公共字符串应用(整数i){
返回方法(i);
}
});
由于异常,我无法执行上述操作。有什么好的模式来处理它吗?将选中的异常作为RuntimeException传播:
try {
return someMethod(i);
} catch (SomeException e) {
throw new RuntimeException(e);
}
编辑:由于转换后的列表是惰性计算的,因此在访问列表元素之前不会引发异常。您可以通过将转换后的列表复制到新列表中来强制计算,如:
s = new ArrayList<>(s);
s=新的数组列表;
您可以将其包装在一个try-catch块中,该块捕获RuntimeException并根据需要处理它;可以通过对RuntimeException调用getCause()来获取原始SomeException实例。或者您可以让RuntimeException冒泡出来。这取决于您希望如何处理异常
List<String> s = Lists.newArrayList(
Iterables.filter(
Iterables.transform(l, new Function<Integer, String>() {
@Override
public String apply(Integer i) {
try {
return someMethod(i);
} catch (SomeException e) {
e.printStackTrace();
return null;
}
}
}), Predicates.notNull()))`
然后,列表转换将是:
List<Wrapper> wrappers = Lists.newArrayList(
Iterables.filter(
Iterables.transform(l, new Function<Integer, Wrapper>() {
@Override
public Wrapper apply(Integer i) {
Wrapper wrapper = new Wrapper();
try {
wrapper.result = someMethod(i);
} catch (SomeException e) {
wrapper.exception = e;
}
return wrapper;
}
}), new Predicate<Wrapper>() {
@Override
public boolean apply(Wrapper wrapper) {
return wrapper.exception == null;
}
}));
List wrappers=Lists.newArrayList(
Iterables.filter(
transform(l,新函数(){
@凌驾
公共包装应用(整数i){
包装器=新包装器();
试一试{
wrapper.result=someMethod(i);
}捕获(某些例外){
wrapper.exception=e;
}
返回包装器;
}
}),新谓词(){
@凌驾
公共布尔应用(包装器){
返回wrapper.exception==null;
}
}));
您可以使用
public interface FunctionWithException<T, R, E extends Exception> {
public R apply(T t) throws E;
}
公共接口功能异常{
公共R应用(T)抛出E;
}
使用Java 8。。。哈Guava不喜欢选中的异常。@BoristheSpider Java 8有什么帮助?流API似乎也不允许检查异常。我应该在转换函数之外放置什么?如果您询问转换方法需要什么类型的声明,那么您根本不需要任何声明。这是因为不需要声明抛出运行时异常。它只会在调用堆栈中向上传递,直到有人感兴趣正如Guava开发人员所指出的那样,
已被弃用,因此捕获选中的异常,然后抛出一个包装的RuntimeException
可能没有太大区别,谢谢@DexterLegaspi——我更新了答案,不使用Throwables.propagate()。我不喜欢使用null
作为哨兵,以后再过滤掉。当someMethod
合法地返回null
时会发生什么?越来越乱了。你觉得把结果包装起来怎么样?
public interface FunctionWithException<T, R, E extends Exception> {
public R apply(T t) throws E;
}