Prevent NPE for corrupt accounts

If an account is encountered where the external IDs exist but not
the actual account entry, a NPE would result.  Instead, prevent
the NPE and throw an UnloggedFailure, and also guard the DB access
from leaking resources with a try/finally.

Change-Id: Id6416bb6f365d6eaf552e3b7cf108e13cc69154b
diff --git a/src/main/java/com/googlesource/gerrit/plugins/adminconsole/ShowAccountCommand.java b/src/main/java/com/googlesource/gerrit/plugins/adminconsole/ShowAccountCommand.java
index 2d7bd75..5561707 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/adminconsole/ShowAccountCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/adminconsole/ShowAccountCommand.java
@@ -102,6 +102,9 @@
 
     for (Id id : idList) {
       account = accountResolver.find(id.toString());
+      if (account == null) {
+        throw new UnloggedFailure("Account " + id.toString() + " does not exist.");
+      }
       stdout.println("Full name:         " + account.getFullName());
       stdout.println("Account Id:        " + id.toString());
       stdout.println("Preferred Email:   " + account.getPreferredEmail());
@@ -111,36 +114,38 @@
 
       final ReviewDb db = schema.open();
 
-      stdout.println("");
-      stdout.println("External Ids:");
-      stdout.println(String
-          .format("%-50s %s", "Email Address:", "External Id:"));
-      for (AccountExternalId accountExternalId : db.accountExternalIds()
-          .byAccount(account.getId())) {
-        stdout.println(String.format("%-50s %s",
-            (accountExternalId.getEmailAddress() == null ? ""
-                : accountExternalId.getEmailAddress()), accountExternalId
-                .getExternalId()));
-      }
-
-      if (showKeys) {
+      try {
         stdout.println("");
-        stdout.println("Public Keys:");
-        List<AccountSshKey> sshKeys =
-            db.accountSshKeys().byAccount(account.getId()).toList();
-        if (sshKeys == null || sshKeys.isEmpty()) {
-          stdout.println("None");
-        } else {
-          stdout.println(String.format("%-9s %s", "Status:", "Key:"));
-          for (AccountSshKey sshKey : sshKeys) {
-            stdout.println(String.format("%-9s %s", (sshKey.isValid()
-                ? "Active" : "Inactive"), sshKey.getSshPublicKey()));
+        stdout.println("External Ids:");
+        stdout.println(String
+            .format("%-50s %s", "Email Address:", "External Id:"));
+        for (AccountExternalId accountExternalId : db.accountExternalIds()
+            .byAccount(account.getId())) {
+          stdout.println(String.format("%-50s %s",
+              (accountExternalId.getEmailAddress() == null ? ""
+                  : accountExternalId.getEmailAddress()), accountExternalId
+                  .getExternalId()));
+        }
+
+        if (showKeys) {
+          stdout.println("");
+          stdout.println("Public Keys:");
+          List<AccountSshKey> sshKeys =
+              db.accountSshKeys().byAccount(account.getId()).toList();
+          if (sshKeys == null || sshKeys.isEmpty()) {
+            stdout.println("None");
+          } else {
+            stdout.println(String.format("%-9s %s", "Status:", "Key:"));
+            for (AccountSshKey sshKey : sshKeys) {
+              stdout.println(String.format("%-9s %s", (sshKey.isValid()
+                  ? "Active" : "Inactive"), sshKey.getSshPublicKey()));
+            }
           }
         }
+      } finally {
+        db.close();
       }
 
-      db.close();
-
       if (showGroups) {
         stdout.println();
         stdout.println("Member of groups"