Periksa null Sebelum Memanggil Parse di Double.parseDouble

1. Ikhtisar

Saat mengonversi Java String menjadi double , kami biasanya akan menggunakan metode Double.parseDouble (String value) . Metode ini memungkinkan kita untuk mengubah representasi String dari double yang diberikan - misalnya, "2.0" - menjadi nilai double primitif .

Seperti kebanyakan panggilan metode, sebaiknya hindari meneruskan referensi null , yang kemungkinan akan menghasilkan NullPointerException pada waktu proses.

Dalam tutorial ini, kita akan menjelajahi beberapa cara untuk memeriksa null sebelum menjalankan Double.parseDouble . Kami akan mulai dengan mempertimbangkan solusi menggunakan Java inti sebelum melihat beberapa pustaka eksternal.

2. Mengapa Diperiksa

Pertama, mari kita pahami apa yang terjadi jika kita tidak memeriksa nilai null saat mengurai S tring . Mari kita mulai dengan melewatkan String kosong :

double emptyString = Double.parseDouble("");

Ketika kita menjalankan kode ini, itu akan memunculkan java.lang.NumberFormatException :

Exception in thread "main" java.lang.NumberFormatException: empty String at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842) at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110) at java.lang.Double.parseDouble(Double.java:538) ...

Sekarang mari pertimbangkan untuk memberikan referensi null :

double nullString = Double.parseDouble(null);

Tidak mengherankan, java.lang.NullPointerException akan muncul kali ini:

Exception in thread "main" java.lang.NullPointerException at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1838) at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110) at java.lang.Double.parseDouble(Double.java:538) ...

Seperti yang kita ketahui, menggunakan pengecualian dalam kode aplikasi kita merupakan praktik yang baik. Tetapi secara umum, kita harus menghindari pengecualian yang tidak dicentang seperti ini, yang kemungkinan besar merupakan hasil dari kesalahan pemrograman .

3. Bagaimana Memeriksa Dengan Core Java

Di bagian ini, kita akan melihat beberapa opsi untuk memeriksa nilai null atau kosong menggunakan inti Java.

3.1. Menggunakan Vanilla Java

Mari kita mulai dengan mendefinisikan metode sederhana yang akan memeriksa apakah nilai yang kita berikan adalah null atau String kosong :

private static double parseStringToDouble(String value) 

Seperti yang bisa kita lihat, jika nilai yang kita coba parse adalah null atau kosong, metode ini tidak mengembalikan angka. Jika tidak, kami memanggil metode Double.parseDouble .

Kita dapat mengambil contoh ini selangkah lebih maju dan menawarkan kemungkinan untuk menyediakan default yang telah ditentukan sebelumnya :

private static double parseStringToDouble(String value, double defaultValue)  return value == null 

Saat kami memanggil metode ini, kami menyediakan default yang sesuai untuk dikembalikan jika nilai yang diberikan adalah null atau kosong:

assertThat(parseStringToDouble("1", 2.0d)).isEqualTo(1.0d); assertThat(parseStringToDouble(null, 1.0d)).isEqualTo(1.0d); assertThat(parseStringToDouble("", 1.0d)).isEqualTo(1.0d);

3.2. Menggunakan Opsional

Sekarang mari kita lihat solusi berbeda dengan penggunaan Opsional :

private static Optional parseStringToOptionalDouble(String value)  value.isEmpty() ? Optional.empty() : Optional.of(Double.valueOf(value)); 

Kali ini, kami menggunakan Opsional sebagai tipe pengembalian. Oleh karena itu, ketika kita memanggil metode ini, kita kemudian memiliki kemungkinan untuk memanggil metode standar seperti isPresent () dan isEmpty () untuk menentukan apakah ada nilai:

parseStringToOptionalDouble("2").isPresent()

Kami juga dapat mengembalikan nilai default menggunakan metode orElse dari Opsional :

parseStringToOptionalDouble("1.0").orElse(2.0d) parseStringToOptionalDouble(null).orElse(2.0d) parseStringToOptionalDouble("").orElse(2.0d)

4. Perpustakaan Eksternal

Sekarang setelah kita memiliki pemahaman yang baik tentang cara memeriksa nilai null dan kosong menggunakan inti Java, mari kita lihat beberapa pustaka eksternal.

4.1. Google Guava

Solusi eksternal pertama yang akan kita lihat adalah Google Guava, yang tersedia di Maven Central:

 com.google.guava guava 28.2-jre 

Kita cukup menggunakan metode Doubles.tryParse :

Doubles.tryParse(MoreObjects.firstNonNull("1.0", "2.0")) Doubles.tryParse(MoreObjects.firstNonNull(null, "2.0"))

Dalam contoh ini, kami juga menggunakan metode MoreObjects.firstNonNull , yang akan mengembalikan parameter pertama dari dua parameter tertentu yang bukan null .

Kode ini akan berfungsi dengan baik dalam banyak kasus, tetapi mari kita bayangkan contoh yang berbeda:

Doubles.tryParse(MoreObjects.firstNonNull("", "2.0"))

Dalam kasus ini, karena String kosong bukan null , metode ini akan mengembalikan null alih-alih menampilkan NumberFormatException . Kami menghindari pengecualian, tetapi kami masih harus menangani nilai null di beberapa titik dalam kode aplikasi kami.

4.2. Apache Commons Lang NumberUtils

Kelas NumberUtils menyediakan banyak utilitas berguna yang membuatnya lebih mudah untuk bekerja dengan angka.

Artefak Apache Commons Lang tersedia dari Maven Central:

 org.apache.commons commons-lang3 3.9 

Kemudian kita cukup menggunakan metode untuk Menggandakan dari NumberUtils :

NumberUtils.toDouble("1.0") NumberUtils.toDouble("1.0", 1.0d) 

Di sini, kami memiliki dua opsi:

  • Convert a String to a double, returning 0.0d if the conversion fails
  • Convert a String to a double, providing a defined default value if the conversion fails

If we pass an empty or null value, 0.0d is returned by default:

assertThat(NumberUtils.toDouble("")).isEqualTo(0.0d); assertThat(NumberUtils.toDouble(null)).isEqualTo(0.0d);

This is better than the previous example, as we always get a double return value no matter what happens during the conversion.

4.3. Vavr

Last, but not least, let's take a look at vavr.io, which offers a functional approach.

As always, the artifact can be found on Maven Central:

 io.vavr vavr 0.10.2 

Again, we'll define a simple method that makes use of the vavr Try class:

public static double tryStringToDouble(String value, double defaultValue) { return Try.of(() -> Double.parseDouble(value)).getOrElse(defaultValue); } 

Kami akan memanggil metode ini dengan cara yang persis sama seperti di contoh kami yang lain:

assertThat(tryStringToDouble("1", 2.0d)).isEqualTo(1.0d); assertThat(tryStringToDouble(null, 2.0d)).isEqualTo(2.0d); assertThat(tryStringToDouble("", 2.0d)).isEqualTo(2.0d);

5. Kesimpulan

Dalam tutorial singkat ini, kita telah mempelajari beberapa cara untuk memeriksa string kosong dan null sebelum menjalankan metode Double.parseDouble .

Seperti biasa, kode sumber lengkap artikel tersedia di GitHub.