Mencegah NullPointerException dengan Optional

Beranda » Java » Mencegah NullPointerException dengan Optional

Pernah kah kalian mengalami error seperti dibahwah ini. Error semacam ini sering kali terjadi ketika kita mengakses attribute dari suatu object yang nilainya null. Tentu akan menjadi merepotkan jika kita harus melakukan pengecekan attribute satu per satu, apalagi jika attributenya bersarang atau nested.

contoh output NullPointerException
NullPointerException

berikut code lengkap error diatas.

package budi.code;

import lombok.Data;

public class CodingduluajaLatihan {
    public static void main(String[] args) {
        Penduduk penduduk = new Penduduk();
        penduduk.setNama("Budi");
        penduduk.setNik("0001112223334445");

        Alamat alamat = new Alamat();
        alamat.setDetail("Jl kemanapun bersamamu no 999");

        penduduk.setAlamat(alamat);

        String namaProvinsi = penduduk.getAlamat().getProvinsi().getNama();
        System.out.println(namaProvinsi);
    }
}

@Data
class Penduduk {
    private String nama;
    private String nik;
    private Alamat alamat;
}

@Data
class Alamat {
    private Provinsi provinsi;
    private String detail;
}

@Data
class Provinsi {
    private String nama;
    private String kode;
}

NullPointerException di atas terjadi karena kita ingin mengakses nama provinsi yang ada di object penduduk, namun data tersebut null. Untuk mengatasi hal tersebut tanpa melakukan pengecekan if null secara berulang kali, kita dapat menggunakan Optional. Optional dikenalkan mulai sejak java 8. Dengan menggunakan Optional kita dapat mengecek apakah attribute yang kita inginkan null, bahkan mengeset attibute tersebut dengan default jika nilainya null tanpa perlu khawatir adanya NullPointerException. Sehingga kita dapat mencegah NullPointerException dengan Optional.

berikut contoh untuk melakukan pengecekan nama provinsi dengan Optional.

public class CodingduluajaLatihan {
    public static void main(String[] args) throws Exception {
        Penduduk penduduk = new Penduduk();
        penduduk.setNama("Budi");
        penduduk.setNik("0001112223334445");

        Alamat alamat = new Alamat();
        alamat.setDetail("Jl kemanapun bersamamu no 999");

        penduduk.setAlamat(alamat);

//        String namaProvinsi = penduduk.getAlamat().getProvinsi().getNama();

        Optional<String> namaOptional =
                Optional.ofNullable(penduduk)
                        .map(Penduduk::getAlamat)
                        .map(Alamat::getProvinsi)
                        .map(Provinsi::getNama);

        String namaProvinsi;
        // pengecekan null
        if (namaOptional.isPresent()) {
            namaProvinsi = namaOptional.get();
        } else {
            throw new Exception("Nama Provinsi Tidak ada");
        }

        System.out.println(namaProvinsi);
    }
}

hasil outputnya akan menjadi seperti dibawah ini.

output setelah mengunakan optional
Output setelah mengunakan optional

Jika ingin memberikan default value ketika nama provinsi kosong, kalian cukup menambahkan orElse("default value yang kalian inginkan"). Misal kita akan memberikan default value nama provinsi “Nama tidak ditemukan” ketika value nama provinsi null, maka kodenya akan menjadi seperti dibawah ini.

public class CodingduluajaLatihan {
    public static void main(String[] args) throws Exception {
        Penduduk penduduk = new Penduduk();
        penduduk.setNama("Budi");
        penduduk.setNik("0001112223334445");

        Alamat alamat = new Alamat();
        alamat.setDetail("Jl kemanapun bersamamu no 999");

        penduduk.setAlamat(alamat);

//        String namaProvinsi = penduduk.getAlamat().getProvinsi().getNama();

        String namaProvinsi =
                Optional.ofNullable(penduduk)
                        .map(Penduduk::getAlamat)
                        .map(Alamat::getProvinsi)
                        .map(Provinsi::getNama)
                        .orElse("Nama tidak Ditemukan");

        System.out.println(namaProvinsi);
    }
}

ouput :

Bagaimana? lebih singkat dan lebih mudah bukan. Oh ya, dalam kode latihan kita kali ini, kita menggunakan anotasi Lombok untuk mempersingkat boilerplate, jadi kita tidak perlu menulis getter, setter, toString dan formalitas lainnya. Materi tentang Lombok dapat kalian pelajari di Pengenalan Lombok.

Kategori : Java, Java Dasar
Oleh : budiyono, diterbitkan : disunting :