title: CompletableFuture exception behavior with join() then get()
body: <p>My intuition is that the following code is wrong. I believe because join() is being used, any exceptions throw while completing the futures will be unchecked. Then when get() is called, there will be no checked exceptions, no logging of any errors, and difficulty diagnosing errors during failure.</p>
  
  <pre><code>    List&lt;CompletableFuture&gt; list = ImmutableList.of(future1, future2);
      CompletableFuture.allOf(list.toArray(new CompletableFuture[list.size()])).join();
  
      try {
          result1 = future1.get();
          result2 = future2.get();
  
      } catch (InterruptedException | ExecutionException e) {
          // will this ever run if join() is already called?
      }
  </code></pre>
  
  <p>I have looked through the documentation for CompletableFuture but haven't found the exact answer to my question. I am asking here and will then go read through the source code.</p>
  
  <p>The only why I can see that the catch block code would run is if somehow checked exceptions can be saved in some execution context and not thrown in join() (or thrown wrapped by an unchecked exception), and then throw again in some form after get(). This seems unlikely to me.</p>
  
  <p>So my ultimate question is, will the catch block code ever run?</p>