code: protected void throwException() throws InterruptedException, IOException {
  
          if (this.exception instanceof IOException) {
              throw (IOException) this.exception;
          }
          if (this.exception instanceof InterruptedException) {
              throw (InterruptedException) this.exception;
          }
          if (this.exception instanceof RuntimeException) {
              throw (RuntimeException) this.exception;
          }
          throw new RuntimeException(this.exception);
      }
docs: Throws the receiver's exception in its correct class.
  
  This assumes that the exception is not null.
  
  @throws InterruptedException
  @throws IOException