import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class CallableMelemparException {
    public static void main(String[] args) throws InterruptedException {
        Callable<Integer> pembacaKonfigurasi = () -> {
            String isi = null; // simulasi: konfigurasi gagal dimuat
            if (isi == null) {
                throw new IllegalStateException("berkas konfigurasi tidak ditemukan");
            }
            return Integer.parseInt(isi);
        };

        FutureTask<Integer> tugas = new FutureTask<>(pembacaKonfigurasi);
        Thread t = new Thread(tugas, "pembaca-konfigurasi");
        t.start();
        t.join(); // tunggu tugas selesai (selesai dengan kegagalan pun tetap selesai)

        try {
            tugas.get(); // tidak pernah berhasil karena tugas gagal
            System.out.println("baris ini tidak pernah tercetak");
        } catch (ExecutionException e) {
            Throwable penyebab = e.getCause();
            System.out.println("get() melempar ExecutionException");
            System.out.println("penyebabnya    : " + penyebab.getClass().getSimpleName());
            System.out.println("pesan penyebab : " + penyebab.getMessage());
        }
    }
}
