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: padathrowIfFailed()ShutdownOnSuccess: padaresult()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()atauresult() - Petakan penyebab ke pengecualian khusus melalui
throwIfFailed(mapper) - Pembatalan bekerja melalui interupsi utas; tulislah tugas yang kooperatif
joinUntilmemberlakukan 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
- Model Konkurensi Terstruktur
- StructuredTaskScope
- Penghentian saat Gagal dan Berhasil
- Penanganan Error dan Pembatalan