Java 使用Google Guava的异常

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)

使用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);
       }
     });
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冒泡出来。

这取决于您希望如何处理异常

  • 发生异常时停止列表转换:请参阅@dnault的答案
  • 继续列表转换并删除导致异常的元素(并记录一些错误消息)。 在这种情况下,当发生异常时,我们将返回null,此null值将从最终列表中删除:

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