Periksa nol Sebelum Memanggil Parse di Double.parseDouble

1. Gambaran keseluruhan

Semasa menukar Java String menjadi double , kita biasanya akan menggunakan kaedah Double.parseDouble (String value) . Kaedah ini membolehkan kita menukar representasi String dari double yang diberikan - contohnya, "2.0" - menjadi nilai ganda primitif .

Seperti kebanyakan panggilan kaedah, adalah praktik yang baik untuk mengelakkan melewati rujukan nol , yang kemungkinan akan menghasilkan NullPointerException pada waktu runtime.

Dalam tutorial ini, kita akan meneroka beberapa cara untuk memeriksa nol sebelum menggunakan Double.parseDouble . Kami akan memulakan dengan mempertimbangkan penyelesaian menggunakan Java inti sebelum melihat beberapa perpustakaan luaran.

2. Mengapa Semak

Pertama, mari kita fahami apa yang berlaku jika kita tidak memeriksa nilai nol semasa menguraikan S tring . Mari mulakan dengan memasukkan String kosong :

double emptyString = Double.parseDouble("");

Apabila kita menjalankan kod ini, ia akan membuang 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 kita mempertimbangkan untuk menyampaikan rujukan nol :

double nullString = Double.parseDouble(null);

Tidak mengejutkan, java.lang.NullPointerException akan dilancarkan 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, boleh menjadi amalan yang baik untuk menggunakan pengecualian dalam kod aplikasi kita. Tetapi secara umum, kita harus mengelakkan pengecualian yang tidak diperiksa seperti ini, yang mungkin merupakan hasil daripada kesalahan pengaturcaraan .

3. Cara Memeriksa Dengan Core Java

Dalam seksyen ini, kita akan lihat pada beberapa pilihan untuk memeriksa null atau kosong nilai menggunakan Java teras.

3.1. Menggunakan Vanilla Java

Mari kita mulakan dengan menentukan kaedah mudah yang akan memeriksa sama ada nilai yang kita lalui adalah kosong atau String kosong :

private static double parseStringToDouble(String value) 

Seperti yang dapat kita lihat, jika nilai yang ingin kita uraikan adalah nol atau kosong kaedah ini mengembalikan bukan nombor. Jika tidak, kami menggunakan kaedah Double.parseDouble .

Kita boleh mengambil contoh ini selangkah lebih jauh dan menawarkan kemungkinan memberikan lalai yang telah ditentukan :

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

Apabila kita sembah kaedah ini, kami membekalkan lalai yang sesuai untuk kembali jika nilai dibekalkan 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 Pilihan

Sekarang mari kita lihat penyelesaian yang berbeza dengan penggunaan Pilihan :

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

Kali ini, kami menggunakan Pilihan sebagai jenis pengembalian. Oleh itu, apabila kita menggunakan kaedah ini, kita mempunyai kemungkinan untuk memanggil kaedah standard seperti isPresent () dan isEmpty () untuk menentukan apakah ada nilai:

parseStringToOptionalDouble("2").isPresent()

Kami juga dapat mengembalikan nilai lalai menggunakan kaedah orElse Pilihan :

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

4. Perpustakaan Luar

Sekarang kita mempunyai pemahaman yang baik bagaimana untuk memeriksa null nilai dan kosong menggunakan Java teras, mari kita lihat beberapa perpustakaan luar.

4.1. Jambu Batu Google

Penyelesaian luaran pertama yang akan kita lihat ialah Google Jambu Batu, yang terdapat di Maven Central:

 com.google.guava guava 28.2-jre 

Kita hanya boleh menggunakan kaedah Doubles.tryParse :

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

Dalam contoh ini, kami juga menggunakan kaedah MoreObjects.firstNonNull , yang akan mengembalikan yang pertama dari dua parameter yang diberikan yang tidak nol .

Kod ini akan berfungsi dengan baik dalam kebanyakan kes, tetapi mari kita bayangkan contoh yang berbeza:

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

Dalam kes ini, kerana String kosong tidak kosong , kaedah ini akan mengembalikan nol dan bukannya membuang NumberFormatException . Kami mengelakkan pengecualian, tetapi kami masih perlu menangani nilai nol pada suatu ketika dalam kod aplikasi kami.

4.2. Apache Commons Lang NumberUtils

The NumberUtils kelas menyediakan banyak utiliti berguna yang menjadikan ia lebih mudah untuk bekerja dengan nombor.

Artefak Apache Commons Lang boleh didapati dari Maven Central:

 org.apache.commons commons-lang3 3.9 

Kemudian kita hanya boleh menggunakan kaedah untuk Menggandakan dari NumberUtils :

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

Di sini, kami mempunyai dua pilihan:

  • 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 menggunakan kaedah ini dengan cara yang sama seperti 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 ini cepat, kita telah diterokai beberapa cara untuk memeriksa null dan rentetan kosong sebelum menyeru Double.parseDouble kaedah.

Seperti biasa, kod sumber penuh artikel terdapat di GitHub.