Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Google Guava中的Throwables.PropagativeInstanceof()?_Java_Guava - Fatal编程技术网

Java 如何使用Google Guava中的Throwables.PropagativeInstanceof()?

Java 如何使用Google Guava中的Throwables.PropagativeInstanceof()?,java,guava,Java,Guava,它不是很具体。一个真正的程序会是什么样子?我真的不明白这些方法的目的,propagate(),propagateifmably()。何时使用它们?这些方法的目的是提供一种方便的方法来处理已检查的异常 public String getCacheValue(String key) throws SQLException{ try{ return cache.get(key); }catch(ExecutedException ex){ Throwables.pr


它不是很具体。一个真正的程序会是什么样子?我真的不明白这些方法的目的,
propagate()
propagateifmably()
。何时使用它们?

这些方法的目的是提供一种方便的方法来处理已检查的异常

public String getCacheValue(String key) throws SQLException{
  try{
       return cache.get(key);
  }catch(ExecutedException ex){
       Throwables.propagateIfInstanceOf(ex.getCause(), SQLException.class);
       Throwables.propagate(ex);
  }
}
Throwables.propagate()
是将已检查异常包装成未检查异常(以避免在方法的
throws
子句中声明它)的常用习惯用法的缩写

Throwables.propagateIfInstanceOf()
用于追溯已检查的异常,就像它们的类型在方法的
throws
子句中声明一样

换言之,所讨论的代码

public void doSomething() 
    throws IOException, SQLException {

    try {
        someMethodThatCouldThrowAnything();
    } catch (IKnowWhatToDoWithThisException e) {
        handle(e);
    } catch (Throwable t) {
        Throwables.propagateIfInstanceOf(t, IOException.class);
        Throwables.propagateIfInstanceOf(t, SQLException.class);
        throw Throwables.propagate(t);
    }  
}
是以下代码的缩写:

public void doSomething() 
    throws IOException, SQLException {

    try {
        someMethodThatCouldThrowAnything();
    } catch (IKnowWhatToDoWithThisException e) {
        handle(e);
    } catch (SQLException ex) {
        throw ex;
    } catch (IOException ex) {
        throw ex;
    } catch (Throwable t) {
        throw new RuntimeException(t);
    }  
}
另请参见:


我查阅了番石榴一次性饮品的文档,但没有发现它们真的有用。在要抛出包含已检查异常的未检查异常的场景中,使用throw new RuntimeException(e)比Throwables.propagate()更容易理解。

我可以为任何认为这很有用的人提供的一个场景是,如果您有一个方法包含已抛出的任何异常,然后,这可以用于将原因展开/转换为特定异常

示例:Guava的LoadingCache中的方法将所有选中的异常包装到。文档说明可以使用检查异常

如果我们知道
cache.get()
将抛出这些异常(可能特定于LoadingCache,但如果值为misisng,则缓存将尝试加载一个可以抛出选中异常的值),则可以使用这里的
Throwables.propagatifiinstanceof
为要处理的调用方法抛出特定异常


您编写的方法的第二个版本不等效。。。您需要再添加两个
catch
块来重新显示异常。。。一个用于
运行时异常
,一个用于
错误
Throwables.propagate
仅将Throwables包装在
RuntimeException
中,前提是它还不是未检查的异常。我仍然不会取消它。如果我想传播异常,为什么还要捕获它?我可以做:public void doSomething()抛出IOException,SQLException{try{somemethodthattowanything();}catch(Iknowwhattowiththis exception e){handle(e);}}。这不是一个真实的例子…@Jeny:You can't do do is'somemethodthat couldthrowanything()`可以抛出一些选中的异常,而不是
IOException
SQLException
。是的,然后我们将其包装在运行时异常中,而不是按原样。这是一个不同的用例,完全依赖于Throwables.propagate(t),但它不能解释没有这种行为的场景。还是我们总是用propagate()结束块?整个想法是不是只是把我们能做的一切都重新扔到原处,把剩下的都扔到垃圾堆里,什么都不扔?然后我开始理解…你不必检查你的可丢弃项是一个特定的已检查异常、一个运行时异常还是一个错误。它防止了过多的一次性封装。不常见的情况是,会出现长达数公里的包装运行时异常,这会导致很长的堆栈跟踪。最后看到最后一个有价值。
public String getCacheValue(String key) throws SQLException{
  try{
       return cache.get(key);
  }catch(ExecutedException ex){
       Throwables.propagateIfInstanceOf(ex.getCause(), SQLException.class);
       Throwables.propagate(ex);
  }
}