Praktik Mandiri 3: Exception Handling, Collections dan Multithreading

1. Exception Handling

Konsep: Menangani kesalahan runtime dan alur program yang tidak terduga.

Latihan Dasar:

Tugas 1: Pembagian dengan Penanganan Input Tidak Valid

  • Buat program yang meminta dua angka dari pengguna (gunakan Scanner).
  • Lakukan pembagian angka pertama dengan kedua.
  • Tangani exception jika:
    • Input bukan angka (InputMismatchException).
    • Pembagian dengan nol (ArithmeticException).

Contoh Solusi:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Division {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        try {
            System.out.print("Masukkan angka pertama: ");
            int a = scanner.nextInt();
            System.out.print("Masukkan angka kedua: ");
            int b = scanner.nextInt();
            System.out.println("Hasil: " + (a / b));
        } catch (InputMismatchException e) {
            System.out.println("Input harus angka!");
        } catch (ArithmeticException e) {
            System.out.println("Tidak bisa dibagi dengan 0!");
        } finally {
            scanner.close();
        }
    }
}

Tantangan:

  • Buat custom exception InvalidAgeException jika usia yang dimasukkan < 18.
  • Gunakan exception ini dalam program pendaftaran akun.

2. Collections

Konsep: Mengelola data dalam struktur seperti List, Set, dan Map.

Latihan Dasar:

Tugas 2: Menghitung Frekuensi Kata

  • Baca input kalimat dari pengguna.
  • Pisahkan kata-kata dan simpan dalam List<String>.
  • Hitung frekuensi kemunculan setiap kata menggunakan Map<String, Integer>.
  • Cetak hasilnya.

Contoh Solusi:

import java.util.*;

public class WordFrequency {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Masukkan kalimat:");
        String sentence = scanner.nextLine();
        List<String> words = Arrays.asList(sentence.split(" "));
        
        Map<String, Integer> frequency = new HashMap<>();
        for (String word : words) {
            frequency.put(word, frequency.getOrDefault(word, 0) + 1);
        }
        
        System.out.println("Frekuensi Kata:");
        frequency.forEach((k, v) -> System.out.println(k + ": " + v));
    }
}

Tantangan:

  • Buat program untuk mengelola daftar siswa:
    • Gunakan Map<String, List<Integer>> untuk menyimpan NIM dan daftar nilai.
    • Hitung rata-rata nilai per siswa.
    • Urutkan siswa berdasarkan NIM menggunakan TreeMap.

3. Multithreading

Konsep: Menjalankan beberapa proses secara bersamaan.

Latihan Dasar:

Tugas 3: Counter dengan Thread

  • Buat dua thread yang menambah dan mencetak nilai counter.
  • Gunakan synchronized untuk menghindari race condition.

Contoh Solusi:

public class Counter implements Runnable {
private int count = 0;

public class Counter implements Runnable {
    private int count = 0;

    public synchronized void increment() {
        count++;
        System.out.println(Thread.currentThread().getName() + ": " + count);
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            increment();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Counter counter = new Counter();
        Thread t1 = new Thread(counter);
        Thread t2 = new Thread(counter);
        t1.start();
        t2.start();
    }
}

Tantangan:

  • Implementasikan producer-consumer problem menggunakan wait() dan notify().
  • Gunakan ExecutorService untuk menjalankan 5 thread yang menghitung faktorial secara paralel.

Tips Belajar:

  1. Baca Dokumentasi: Pelajari class Java seperti ArrayListHashMap, dan Thread di docs.oracle.com.
  2. Eksperimen: Ubah kode contoh, lihat apa yang terjadi jika menghapus synchronized atau menggunakan HashSet vs TreeSet.
  3. Debugging: Gunakan breakpoint di IDE untuk melihat alur program saat runtime.

Semangat belajar! 🚀