Java: Remove e.printStracktrace() in favor of a cause (#207)

diff --git a/java/src/main/java/com/google/crypto/tink/subtle/EngineFactory.java b/java/src/main/java/com/google/crypto/tink/subtle/EngineFactory.java
index 5b2a4fb..a88b0a2 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/EngineFactory.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/EngineFactory.java
@@ -155,28 +155,23 @@
   }
 
   public T_ENGINE getInstance(String algorithm) throws GeneralSecurityException {
-    for (Provider p : this.policy) {
-      if (tryProvider(algorithm, p)) {
-        return this.instanceBuilder.getInstance(algorithm, p);
+    Exception cause = null;
+    for (Provider provider : this.policy) {
+      try {
+        return this.instanceBuilder.getInstance(algorithm, provider);
+      } catch (Exception e) {
+        if (cause == null) {
+          cause = e;
+        }
       }
     }
     if (letFallback) {
       return this.instanceBuilder.getInstance(algorithm, null);
     }
-    throw new GeneralSecurityException("No good Provider found.");
+    throw new GeneralSecurityException("No good Provider found.", cause);
   }
 
   private T_WRAPPER instanceBuilder;
   private List<Provider> policy;
   private boolean letFallback;
-
-  private boolean tryProvider(String algorithm, Provider provider) {
-    try {
-      this.instanceBuilder.getInstance(algorithm, provider);
-      return true;
-    } catch (Exception e) { // Don't care which one specifically.
-      e.printStackTrace();
-      return false;
-    }
-  }
 }