code: public <T1 extends Throwable, T2 extends Throwable, T3 extends Throwable, T4 extends Throwable> 
                  RuntimeException throwIf(Class<T1> t1, Class<T2> t2, Class<T3> t3, Class<T4> t4) 
                  throws T1, T2, T3, T4 {
          Throwable c = getResolvingCause();
          if (t1 != null && t1.isInstance(c)) {
              throw t1.cast(c);
          }
          if (t2 != null && t2.isInstance(c)) {
              throw t2.cast(c);
          }
          if (t3 != null && t3.isInstance(c)) {
              throw t3.cast(c);
          }
          if (t4 != null && t4.isInstance(c)) {
              throw t4.cast(c);
          }
          if (c instanceof RuntimeException) {
              return (RuntimeException) c;
          }
          return this;
      }
docs: Throws the {@linkplain #getResolvingCause() cause} if it is one of the
  specified types, otherwise returns a
  {@linkplain #asRuntimeException() runtime exception}.
  @param <T1>
  @param <T2>
  @param <T3>
  @param <T4>
  @param t1
  @param t2
  @param t3
  @param t4
  @return runtime exception
  @throws T1
  @throws T2
  @throws T3
  @throws T4