diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java
index adc280a..fb4aa0f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java
@@ -62,9 +62,9 @@
     if (name == null) {
       return;
     }
-    Writer out = startRenderText(req, res);
-    out.write(RefServlet.sanitizeRefForText(name));
-    out.close();
+    try (Writer out = startRenderText(req, res)) {
+      out.write(RefServlet.sanitizeRefForText(name));
+    }
   }
 
   @Override
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java
index f0df112..ca35727 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java
@@ -179,22 +179,21 @@
       return;
     }
 
-    Writer writer = startRenderText(req, res);
-    for (RepositoryDescription repo : descs.values()) {
-      for (String name : branches) {
-        String ref = repo.branches.get(name);
-        if (ref == null) {
-          // Print stub (forty '-' symbols)
-          ref = "----------------------------------------";
+    try (Writer writer = startRenderText(req, res)) {
+      for (RepositoryDescription repo : descs.values()) {
+        for (String name : branches) {
+          String ref = repo.branches.get(name);
+          if (ref == null) {
+            // Print stub (forty '-' symbols)
+            ref = "----------------------------------------";
+          }
+          writer.write(ref);
+          writer.write(' ');
         }
-        writer.write(ref);
-        writer.write(' ');
+        writer.write(GitilesUrls.NAME_ESCAPER.apply(stripPrefix(prefix, repo.name)));
+        writer.write('\n');
       }
-      writer.write(GitilesUrls.NAME_ESCAPER.apply(stripPrefix(prefix, repo.name)));
-      writer.write('\n');
     }
-    writer.flush();
-    writer.close();
   }
 
   @Override
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
index e9f95a7..fd3f3f9 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -225,11 +225,15 @@
   }
 
   private static RevWalk newWalk(Repository repo, GitilesView view, GitilesAccess access)
-      throws MissingObjectException, IncorrectObjectTypeException, IOException {
+      throws MissingObjectException, IOException {
     RevWalk walk = new RevWalk(repo);
-    walk.markStart(walk.parseCommit(view.getRevision().getId()));
-    if (view.getOldRevision() != Revision.NULL) {
-      walk.markUninteresting(walk.parseCommit(view.getOldRevision().getId()));
+    try {
+      walk.markStart(walk.parseCommit(view.getRevision().getId()));
+      if (view.getOldRevision() != Revision.NULL) {
+        walk.markUninteresting(walk.parseCommit(view.getOldRevision().getId()));
+      }
+    } catch (IncorrectObjectTypeException iote) {
+      return null;
     }
     setTreeFilter(walk, view, access);
     List<RevFilter> filters = new ArrayList<>(3);
@@ -288,25 +292,18 @@
       return null;
     }
 
-    RevWalk walk = null;
-    try {
-      walk = newWalk(repo, view, access);
-    } catch (IncorrectObjectTypeException e) {
-      return null;
-    }
+    try (RevWalk walk = newWalk(repo, view, access)) {
+      if (walk == null) {
+        return null;
+      }
 
-    Optional<ObjectId> start;
-    try {
-      start = getStart(view.getParameters(), walk.getObjectReader());
-    } catch (IOException e) {
-      walk.close();
-      throw e;
-    }
-    if (start == null) {
-      return null;
-    }
+      Optional<ObjectId> start = getStart(view.getParameters(), walk.getObjectReader());
+      if (start == null) {
+        return null;
+      }
 
-    return new Paginator(walk, getLimit(view), start.orNull());
+      return new Paginator(walk, getLimit(view), start.orNull());
+    }
   }
 
   private static int getLimit(GitilesView view) {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
index bd6219b..91e7060 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
@@ -390,8 +390,7 @@
 
       RevTree root = getRoot(view, rw);
       String path = view.getPathPart();
-      TreeWalk tw = new TreeWalk(rw.getObjectReader());
-      try {
+      try (TreeWalk tw = new TreeWalk(rw.getObjectReader())) {
         tw.addTree(root);
         tw.setRecursive(false);
         if (path.isEmpty()) {
@@ -415,7 +414,6 @@
       } catch (IOException | RuntimeException e) {
         // Fallthrough.
       }
-      tw.close();
       return null;
     }
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
index 822f2c4..9007928 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/DocServlet.java
@@ -222,24 +222,25 @@
     }
 
     ObjectReader reader = rw.getObjectReader();
-    TreeWalk tw = TreeWalk.forPath(reader, path, root);
-    if (tw == null) {
+    try (TreeWalk tw = TreeWalk.forPath(reader, path, root)) {
+      if (tw == null) {
+        return null;
+      }
+      if ((tw.getRawMode(0) & TYPE_MASK) == TYPE_TREE) {
+        if (findIndexFile(tw)) {
+          path = tw.getPathString();
+        } else {
+          return null;
+        }
+      }
+      if ((tw.getRawMode(0) & TYPE_MASK) == TYPE_FILE) {
+        if (!path.endsWith(".md")) {
+          return null;
+        }
+        return new MarkdownFile(path, tw.getObjectId(0));
+      }
       return null;
     }
-    if ((tw.getRawMode(0) & TYPE_MASK) == TYPE_TREE) {
-      if (findIndexFile(tw)) {
-        path = tw.getPathString();
-      } else {
-        return null;
-      }
-    }
-    if ((tw.getRawMode(0) & TYPE_MASK) == TYPE_FILE) {
-      if (!path.endsWith(".md")) {
-        return null;
-      }
-      return new MarkdownFile(path, tw.getObjectId(0));
-    }
-    return null;
   }
 
   private static boolean findIndexFile(TreeWalk tw) throws IOException {
