开源项目

相关文章

更多

最近更新

更多

Guava Throwables类-异常处理

2019-04-23 23:05|来源: 网路

Throwable类提供了相关的Throwable接口的实用方法。

类声明

以下是com.google.common.base.Throwables类的声明:

public final class Throwables
   extends Object

类方法

S.N. 方法及说明
1 static List<Throwable> getCausalChain(Throwable throwable)
获取一个Throwable的原因链的列表。
2 static Throwable getRootCause(Throwable throwable)
返回抛出的最里面的原因。
3 static String getStackTraceAsString(Throwable throwable)
返回包含toString()的结果字符串,随后完整抛出,递归的堆栈跟踪。
4 static RuntimeException propagate(Throwable throwable)
传播抛出原样如果RuntimeException或Error是一个实例,否则作为最后的报告,把它包装在一个RuntimeException,然后传播。
5 static <X extends Throwable> void propagateIfInstanceOf(Throwable throwable, Class<X> declaredType)
传播抛出对象完全按原样,当且仅当它是declaredType的一个实例。
6 static void propagateIfPossible(Throwable throwable)
传播抛出对象完全按原样,当且仅当它是RuntimeException或Error的一个实例。
7 static <X extends Throwable> void propagateIfPossible(Throwable throwable, Class<X> declaredType)
传播抛出对象完全按原样,当且仅当它是RuntimeException,错误或的declaredType的一个实例。
8 static <X1 extends Throwable,X2 extends Throwable>void propagateIfPossible(Throwable throwable, Class<X1> declaredType1, Class<X2> declaredType2)
传播抛出对象完全按原样,当且仅当它是RuntimeException,Error,declaredType1或declaredType2的一个实例。

继承的方法

这个类继承了以下类方法:

  • java.lang.Object

Throwables示例

创建使用所选择的任何编辑器下面的java程序,比如 C:/> Guava

GuavaTester.java

import java.io.IOException;
import com.google.common.base.Objects;
import com.google.common.base.Throwables;
public class GuavaTester {
   public static void main(String args[]){
      GuavaTester tester = new GuavaTester();
      try {
         tester.showcaseThrowables();
      } catch (InvalidInputException e) {
         //get the root cause
         System.out.println(Throwables.getRootCause(e));
      }catch (Exception e) {
         //get the stack trace in string format
         System.out.println(Throwables.getStackTraceAsString(e));				
      }

      try {
         tester.showcaseThrowables1();			
      }catch (Exception e) {
         System.out.println(Throwables.getStackTraceAsString(e));				
      }
   }

   public void showcaseThrowables() throws InvalidInputException{
      try {
         sqrt(-3.0);			
      } catch (Throwable e) {
         //check the type of exception and throw it
         Throwables.propagateIfInstanceOf(e, InvalidInputException.class);		
         Throwables.propagate(e);
      }	
   }

   public void showcaseThrowables1(){
      try {			
         int[] data = {1,2,3}; 
         getValue(data, 4);			
      } catch (Throwable e) {        
         Throwables.propagateIfInstanceOf(e, IndexOutOfBoundsException.class);		
         Throwables.propagate(e);
      }	
   }

   public double sqrt(double input) throws InvalidInputException{
      if(input < 0) throw new InvalidInputException();
      return Math.sqrt(input);
   }

   public double getValue(int[] list, int index) throws IndexOutOfBoundsException {
      return list[index];
   }

   public void dummyIO() throws IOException {
      throw new IOException();
   }
  }
   class InvalidInputException extends Exception {
   }

验证结果

使用javac编译器编译如下类

C:\Guava>javac GuavaTester.java

现在运行GuavaTester看到的结果

C:\Guava>java GuavaTester

看到结果。

InvalidInputException
java.lang.ArrayIndexOutOfBoundsException: 4
	at GuavaTester.getValue(GuavaTester.java:52)
	at GuavaTester.showcaseThrowables1(GuavaTester.java:38)
	at GuavaTester.main(GuavaTester.java:19)


相关问答

更多

为什么Guava不为小的ImmutableLists使用专门的类?(Why does Guava not use specialized classes for small ImmutableLists?)

你能帮我理解这里涉及的权衡吗? 这是一个权衡: 性能 - 不分配临时数组可以节省成本。 但是,人们需要进行一些广泛的代码分析和基准测试来量化这种节省。 (我怀疑在大多数应用程序中它都是微不足道的。请阅读@Voo提供的这个链接 !) 可读性 - 拥有一堆额外的重载会使javadoc混乱。 可维护性 - 有一堆重载是以不需要临时对象的方式实现的,这需要大量的复制/粘贴编程,这使得将来的代码维护更加困难。 实用程序 - 这些重载的使用频率是多少? 我希望答案“很少”。 字节码占用空间 - 这些额外的重载 ...

调节方法调用使用Guava RateLimiter类(Throttling method calls using Guava RateLimiter class)

您需要在每次调用时在同一个RateLimiter上调用acquire() ,例如,通过在performOperation()使其可用: public class RateLimiterTest { public static void main(String[] args) { RateLimiter limiter = RateLimiter.create(1.0); for (int i = 0; i < 10; i++) { p ...

是否有可能将Guava的ForwardingListIterator和PeekingIterator结合起来?(Is it possible to combine Guava's ForwardingListIterator with a PeekingIterator?)

将一个新的“窥视”概念引入到一个已经很容易在两个方向上滚动的迭代器的价值在哪里? 如果你真的想要它,你可以实现两个简单的静态助手: public static <T> T peekNext(ListIterator<T> iterator) { T next = iterator.next(); iterator.previous(); return next; } public static <T> T peekPrevious(ListIterator<T> iterator) ...

番石榴的IntervalTree(IntervalTree in Guava)

Guava没有提供这个,尽管你可以通过找到给定点之前和之后的第一个范围来在RangeSet之上构建这样的东西。 但一般来说,除了类型的比较排序之外,Guava Range对距离,度量或任何其他内容一无所知 。 他们不知道10比15更接近11 。 Guava doesn't provide this, though you might be able to build such a thing on top of a RangeSet by finding the first range befor ...

Ceylon模块系统:Guava类不匹配,即使依赖树中只有一个Guava(Ceylon module system: Guava class mismatch even though there's only one Guava in dependencies tree)

好的,我明白了。 问题是RoleConverter转换为ceylon.language.String ,而api期望转换为java.lang.String 。 现在修复它: shared class RoleConverter() extends Converter<Role, JString>() { shared actual Role doBackward(JString? name) { "Cannot convert null to role." ...

Guava ValueGraph的简单示例(Simple example of Guava ValueGraph)

Guava wiki提供了以下使用ValueGraph示例: MutableValueGraph<Integer, Double> weightedGraph = ValueGraphBuilder.directed().build(); weightedGraph.addNode(1); weightedGraph.putEdgeValue(2, 3, 1.5); // also adds nodes 2 and 3 if not already present weightedGraph.p ...

不兼容的库版本selenium / guava(Incompatible library version selenium / guava)

因为你对com.google.guava:guava:23.3 org.seleniumhq.selenium:selenium-java:3.0.1依赖性com.google.guava:guava:23.3使用org.seleniumhq.selenium:selenium-java:3.0.1可能会让你在十字路口。 但是Selenium发行说明清楚地提到了以下番石榴依赖性: Selenium v2.49.0 :Bump guava到19版 Selenium v3.1.0 :需要更新最新的番石 ...

在Google Guava EventBus中引发异常(Bring Up Exceptions in Google Guava EventBus)

以下技巧对我有用: 最新的EventBus类有一个名为handleSubscriberException()的方法,您需要在扩展的EventBus类中重写:(这里我包含了两个解决方案,只有一个适用于您的版本) public class CustomEventBus extends EventBus { //If version 18 or bellow @Override void dispatch(Object event, EventSubscriber wrapper) { ...

如何正确使用guava Closer(How to use guava Closer properly)

从番石榴自己的解释来看,你必须使用Throwable ,是的。 这是他们的示例代码段: public void foo() throws IOException { Closer closer = Closer.create(); try { InputStream in = closer.register(openInputStream()); OutputStream out = closer.register(openOutputStream()); // d ...

使用guava AbstractScheduledService(Using guava AbstractScheduledService)

AbstractScheduledServiced实现Service 。 Service接口描述了生命周期方法,包括startAsync 。 ServiceState枚举文字包含有关其含义的文档。 处于NEW状态的服务(刚刚创建): 处于此状态的服务处于非活动状态。 它做的工作量极少,占用资源极少。 要使服务执行某些有用的操作,您必须将其转换为RUNNING状态 此状态下的服务正在运行。 这就是为什么你必须在它做任何事之前启动服务的原因。 我还建议不要从构造函数中调用startAsync,而是从创 ...