0Pricing
Java Academy · Pelajaran

Penanganan Error dan Pembatalan

Teruskan kegagalan dengan rapi.

Penanganan Error dan Pembatalan adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Kegagalan dalam Pohon Tugas

Saat subtugas berjalan secara bersamaan, kesalahan dapat terjadi di cabang mana pun. Konkurensi terstruktur memberi Anda cara yang disiplin untuk meneruskan kegagalan tersebut ke induknya.

Pelajaran ini membahas pengecualian, pembatalan, interupsi, dan batas waktu.

Tempat Pengecualian Muncul

Subtugas yang melemparkan pengecualian tidak langsung membuat program Anda berhenti. Pengecualian tersebut ditangkap pada pegangan Subtask-nya. Tempat pengecualian itu muncul bergantung pada kebijakannya:

  • ShutdownOnFailure: pada throwIfFailed()
  • ShutdownOnSuccess: pada result() jika tidak ada yang berhasil

Meneruskan dengan throwIfFailed

Di sini, sebuah subtugas gagal. throwIfFailed() melemparkannya kembali dalam bentuk yang dibungkus oleh ExecutionException, yang kita tangkap di main.

import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
            scope.fork(() -> "ok");
            scope.fork(() -> { throw new RuntimeException("boom"); });
            scope.join();
            scope.throwIfFailed();
            System.out.println("never reached");
        } catch (ExecutionException e) {
            System.out.println("Caught cause: " + e.getCause().getMessage());
        }
    }
}

Memetakan ke Pengecualian Khusus

throwIfFailed menerima fungsi untuk membungkus penyebabnya dalam tipe pengecualian Anda sendiri, sehingga antarmuka Anda tetap bersih.

import java.util.concurrent.StructuredTaskScope;

class DataAccessException extends Exception {
    DataAccessException(Throwable cause) { super(cause); }
}

public class Main {
    public static void main(String[] args) throws Exception {
        try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
            scope.fork(() -> { throw new RuntimeException("db down"); });
            scope.join();
            scope.throwIfFailed(DataAccessException::new);
        } catch (DataAccessException e) {
            System.out.println("Wrapped: " + e.getCause().getMessage());
        }
    }
}

Pembatalan Otomatis

Saat salah satu subtugas gagal di bawah ShutdownOnFailure, scope membatalkan subtugas saudaranya dengan menginterupsi utas mereka. Anda tidak perlu menulis kode pembatalan sendiri.

Hal ini mencegah pekerjaan yang sia-sia dan tugas yang tertinggal.

Interupsi adalah Mekanismenya

Pembatalan bekerja dengan menginterupsi utas virtual subtugas. Kode kooperatif seharusnya:

  • Membiarkan panggilan pemblokiran melemparkan InterruptedException
  • Memeriksa penanda interupsi secara berkala melalui Thread.currentThread().isInterrupted() dalam perulangan panjang

Merespons Interupsi

Tugas ini memeriksa penanda interupsi dalam sebuah perulangan agar dapat berhenti lebih awal saat scope dihentikan.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread t = Thread.ofVirtual().start(() -> {
            long count = 0;
            while (!Thread.currentThread().isInterrupted()) {
                count++;
                if (count == 1_000_000) break;
            }
            System.out.println("Stopped after " + count + " iterations");
        });
        t.join();
    }
}

Tenggat Waktu dengan joinUntil

Untuk membatasi total waktu, gunakan joinUntil(Instant). Jika tenggat waktu berlalu sebelum semua subtugas selesai, metode ini melemparkan TimeoutException dan scope menghentikan sisanya.

Bentuk Contoh dengan Batas Waktu

Pencabangan yang dilindungi batas waktu biasanya terlihat seperti ini. Tenggat waktu berlaku untuk seluruh grup, bukan untuk setiap subtugas secara terpisah.

import java.time.*;
import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
            scope.fork(() -> "fast");
            scope.joinUntil(Instant.now().plus(Duration.ofSeconds(2)));
            scope.throwIfFailed();
            System.out.println("Completed within deadline");
        } catch (TimeoutException e) {
            System.out.println("Deadline exceeded");
        } catch (ExecutionException e) {
            System.out.println("A subtask failed");
        }
    }
}

Selalu Periksa Kembali Setelah join

Disiplinnya adalah: setelah join() (atau joinUntil), selalu panggil throwIfFailed() atau baca result() sebelum mempercayai nilai subtugas mana pun. Melewatkan langkah ini dapat menyembunyikan kegagalan.

Penghentian Bersih Terjamin

Apa pun cara scope berakhir—secara normal, karena kegagalan, atau karena batas waktu—penutupan blok try-dengan-sumber daya menjamin setiap utas subtugas telah selesai. Tidak ada kebocoran dan tidak ada tugas yatim.

Pemeriksaan Cepat

Ingat kembali cara menghentikan subtugas saudara.

Ringkasan

Anda telah mempelajari penanganan kesalahan dan pembatalan:

  • Pengecualian muncul pada throwIfFailed() atau result()
  • Petakan penyebab ke pengecualian khusus melalui throwIfFailed(mapper)
  • Pembatalan bekerja melalui interupsi utas; tulislah tugas yang kooperatif
  • joinUntil memberlakukan tenggat waktu grup
  • Penutupan scope selalu melakukan pembersihan

Kursus Konkurensi Terstruktur telah selesai.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Penanganan Error dan Pembatalan” gratis?

Ya — teks lengkap “Penanganan Error dan Pembatalan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Penanganan Error dan Pembatalan”?

Teruskan kegagalan dengan rapi. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Penanganan Error dan Pembatalan” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Model Konkurensi Terstruktur
  2. StructuredTaskScope
  3. Penghentian saat Gagal dan Berhasil
  4. Penanganan Error dan Pembatalan
← Kembali ke Java Academy