private void fetchNextIfNeeded() {
    if (next == null) {
      FileTreeWalker.Event ev = walker.next();
      while (ev != null) {
        IOException ioe = ev.ioeException();
        if (ioe != null) throw new UncheckedIOException(ioe);

        // END_DIRECTORY events are ignored
        if (ev.type() != FileTreeWalker.EventType.END_DIRECTORY) {
          next = ev;
          return;
        }
        ev = walker.next();
      }
    }
  }
 @Override
 public Event next() {
   if (!walker.isOpen()) throw new IllegalStateException();
   fetchNextIfNeeded();
   if (next == null) throw new NoSuchElementException();
   Event result = next;
   next = null;
   return result;
 }
  /**
   * Creates a new iterator to walk the file tree starting at the given file.
   *
   * @throws IllegalArgumentException if {@code maxDepth} is negative
   * @throws IOException if an I/O errors occurs opening the starting file
   * @throws SecurityException if the security manager denies access to the starting file
   * @throws NullPointerException if {@code start} or {@code options} is {@ocde null} or the options
   *     array contains a {@code null} element
   */
  FileTreeIterator(Path start, int maxDepth, FileVisitOption... options) throws IOException {
    this.walker = new FileTreeWalker(Arrays.asList(options), maxDepth);
    this.next = walker.walk(start);
    assert next.type() == FileTreeWalker.EventType.ENTRY
        || next.type() == FileTreeWalker.EventType.START_DIRECTORY;

    // IOException if there a problem accessing the starting file
    IOException ioe = next.ioeException();
    if (ioe != null) throw ioe;
  }
 @Override
 public boolean hasNext() {
   if (!walker.isOpen()) throw new IllegalStateException();
   fetchNextIfNeeded();
   return next != null;
 }
 @Override
 public void close() {
   walker.close();
 }