1Z0-826-JPN 対応
並行処理(CompletableFuture)難易度 高無料

次のコードの出力として正しいものを選べ。

1  import java.util.concurrent.*;
2  public class Q6 {
3      public static void main(String[] args) throws Exception {
4          CompletableFuture<Integer> cf = CompletableFuture
5              .<Integer>supplyAsync(() -> { throw new RuntimeException("boom"); })
6              .handle((res, ex) -> ex != null ? -1 : res)
7              .thenApply(n -> n + 100);
8          System.out.println(cf.get());
9      }
10 }
  1. Acf.get() が ExecutionException をスローする
  2. B99
  3. C-1
  4. D101
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:B✓有資格者監修

解説

supplyAsync 内の Supplier が例外を投げると、そのステージは例外完了する。 handle((res, ex) -> ...) は正常・例外のどちらの場合も必ず呼ばれるのが特徴で、 例外時は res=null, ex=例外 が渡る。本コードは ex != null なので -1 を返し、 例外を回復して正常完了の値 -1 に置き換える。続く thenApply は -1 + 100 = 99 を生成。 cf.get() は正常完了なので例外を投げず 99 を返す。
各誤答が違う理由
  • Ahandle が例外を吸収して値に変換するため、下流に例外は伝播せず get() は例外を投げない。(仮に thenApply だけなら例外が伝播し A になる ― そこが対比のポイント)
  • Chandle で -1 に回復した後、thenApply(+100) が必ず適用されるため最終値は -1 ではない。
  • D1 + 100 としてしまう誤り。回復値は -1 なので -1 + 100 = 99。
ひっかけ: handle と exceptionally/whenComplete の違い。handle は両ケースで呼ばれ<戻り値で次ステージの値を差し替える>。whenComplete は副作用のみで値を変えない。
実機確認の答え合わせ
出力:99
(注:handleに渡るのは ex != null の真偽だけが効くため、例外がCompletionExceptionで包まれるか否かに関わらず結果は不変)
✓有資格者(著者)による書き下ろし解説

有資格者(著者)が監修した問題は、すべて無料サンプルとして公開しています。買う前に、その全部を実際に解いて解説まで読めます。有料で追加される問題はAIが作成したもので、有資格者の監修は入っていません。

この問題集の作り方

  1. 問題と解説はAIが作成しています。有資格者(著者)が監修した問題は、無料サンプルとして公開している分だけです。有料で追加される問題に監修は入っていません。
  2. 各問に、公式ドキュメントの出典リンクを付けています。書いてあることは、出典に当たって確かめられます。
  3. 誤答の選択肢それぞれに、なぜ誤りなのかの理由を書いています。
  4. 解説に載せているコンパイル結果は、実際に javac を走らせた出力です。想定した挙動ではありません。
  5. 誤りを見つけたら報告できます。原則として無償で訂正・削除します。
  6. 各試験の運営団体とは無関係の非公式教材です。合格を保証するものではありません。
この分野をもっと解いて、得点源に
並行処理 を含む問題を分野別に演習できます。
演習する →