code: private Exception readException() throws WriteAbortedException,
              OptionalDataException, ClassNotFoundException, IOException {
  
          resetSeenObjects();
  
          // Now we read the Throwable object that was saved
          // WARNING - the grammar says it is a Throwable, but the
          // WriteAbortedException constructor takes an Exception. So, we read an
          // Exception from the stream
          Exception exc = (Exception) readObject();
  
          // We reset the receiver's state (the grammar has "reset" in normal
          // font)
          resetSeenObjects();
          return exc;
      }
docs: Read the next item assuming it is an exception. The exception is not a
  regular instance in the object graph, but the exception instance that
  happened (if any) when dumping the original object graph. The set of seen
  objects will be reset just before and just after loading this exception
  object.
  <p>
  When exceptions are found normally in the object graph, they are loaded
  as a regular object, and not by this method. In that case, the set of
  "known objects" is not reset.
  
  @return the exception read
  
  @throws IOException
  If an IO exception happened when reading the exception
  object.
  @throws ClassNotFoundException
  If a class could not be found when reading the object graph
  for the exception
  @throws OptionalDataException
  If optional data could not be found when reading the
  exception graph
  @throws WriteAbortedException
  If another exception was caused when dumping this exception